行が多い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
。