我有一个包含很多行的 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
,因此不会返回这些行。