grep による while 読み取りループ

grep による while 読み取りループ

多くの行を含む 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、それらの行は返されません。

関連情報