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