使用 grep 進行 while read 迴圈

使用 grep 進行 while read 迴圈

我有一個包含許多行的 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實用程式可以從一個文件中讀取模式並將其與另一個文件的內容進行匹配。不需要在 shell 中循環。

$ grep -f patterns file

使用問題中的兩個文件(文件 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,因此不會傳回這些行。

相關內容