読み取りループ中にgrepを使用する

読み取りループ中にgrepを使用する

行が多いcsvファイルがあり、一致するものを見つけてファイルに出力する必要があります。私のデータは次のとおりです

ファイル1

qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt

以下と一致する必要があります。

ファイル2

qwert
tttttt
aassdd.

私のファイルが大きく、一致リストが長いので、次のようにします。

while read n ; do grep $n File_1.csv >> results.csv ; done < File_2.csv

私が望む結果を得ることはできません。

答え1

繰り返す必要はありません。この-fオプションは、検索するパターンを含むファイルを使用します。

grep -Ff File_2.csv File_1.csv > results.csv

-Fクエリが正規表現ではなく文字通り処理されるようにオプションも追加しました。

答え2

各ファイルに重複エントリがない場合は、次のことができます。

# In file_1 and file_2
sort file_1 file_2 | uniq -d
# In file_1 or file_2 but not both
sort file_1 file_2 | uniq -u
# In file_1 and not file_2
sort file_1 file_2 | uniq -d | sort - file_1 | uniq -u
# In file_2 and not file_1
sort file_1 file_2 | uniq -d | sort - file_2 | uniq -u

答え3

このgrepユーティリティは、あるファイルからパターンを読み取り、他のファイルの内容と一致させることができます。シェルで繰り返す必要はありません。

$ grep -f patterns file

質問にある2つのファイル(ファイル1はfileファイル2はpatterns)を使用すると、次のようになります。

qwerty 
qwerty 
tttttt 

patterns固定文字列(正規表現ではない)のパターンを一致させるには、以下を追加します-F

$ grep -F -f patterns file

与えられた例では、これは未使用と同じ結果を生成します-F

行全体を強制的に一致させるには、以下を追加します-x

$ grep -x -F -f patterns file
tttttt   

qwertyこれらの行は正確に一致しないため、返されませんqwert

関連情報