Linux Grep csv带有来自另一个csv的参数

Linux Grep csv带有来自另一个csv的参数,linux,bash,csv,awk,grep,Linux,Bash,Csv,Awk,Grep,如果file1.csv中有以下内容(空格分隔): 以及file2.csv(逗号分隔)中的以下内容: 有没有办法使用file2.csv搜索file1.csv中的匹配行?目前,如果我想使用file2.csv中的第1行术语搜索file1.csv,我必须手动输入以下内容: grep "BROWN" file1.csv | grep "2" 我想自动执行此搜索,以在file1.csv中查找与file2.csv中给定行中的两个项目匹配的行。我尝试了一些awk命令,但在grep中很难使用awk输出作为参数。

如果file1.csv中有以下内容(空格分隔):

以及file2.csv(逗号分隔)中的以下内容:

有没有办法使用file2.csv搜索file1.csv中的匹配行?目前,如果我想使用file2.csv中的第1行术语搜索file1.csv,我必须手动输入以下内容:

grep "BROWN" file1.csv | grep "2"

我想自动执行此搜索,以在
file1.csv
中查找与
file2.csv
中给定行中的两个项目匹配的行。我尝试了一些awk命令,但在grep中很难使用awk输出作为参数。我正在通过一个标准的Mac终端运行这一切(所以我想我使用的是bash?),非常感谢您的帮助。谢谢大家!

awk一个衬里

awk 'FNR==NR{a[$1]=$2; next} ($1 in a) && a[$1]==$2' FS=, file2.csv FS=" " file1.csv
FNR==NR{a[$1]=$2;next}
:要读取第一个输入文件,在这里
file2.csv
创建一个关联数组
a
,其中键作为
file2.csv
中的第1列,值作为
项目编号

(a中的$1)和&a[$1]=$2
:在迭代第二个输入文件,即
file1.csv
时,检查列1值是否作为数组
a
中的键存在。如果存在,请检查
项目编号是否匹配。如果匹配,结果将为
1
,并将打印行

简单地使用grep

grep -wf <(tr "," " " <file2) file1

grep-wf您可以使用
awk
进行匹配

awk 'BEGIN { FS=","; }
     NR == FNR { a[$1,$2]++; next; }
     FNR == 1 { FS=" "; }
     ($1,$2) in a' file2.csv file1.csv

第二行创建一个数组,其键是
file2.csv
中的值。在处理
file1.csv
时,第三行将字段分隔符改为空格,最后一行匹配前两个字段是数组中键的任何行。

您不需要使用
awk
输出作为
grep
的参数。使用
awk
进行匹配。您真的可以这样更改
FS
?整洁的如果file2.csv包含
a1
,而file1.csv包含
a12
,grep方法将给出错误匹配。Barmar:谢谢您的第一条评论。第二,我使用
-w
选项更新了grep解决方案。由于某些原因,在尝试每一行程序时,我没有得到任何输出。结果不应该打印在下面吗?@DanielEsporma:哈哈,是的,结果应该在这个命令下面。那很可爱:P你确定你的文件顺序正确吗。逗号分隔的一个将首先出现,然后另一个作为file1.csv。另外,您提供的输入没有匹配的记录。您可以使用
FNR==1{FS=”“}
,这样您就不需要更改第二个文件的每一行的FS来跟进蝙蝠侠的评论,
($1fs$2)在a
中,很抱歉这个可笑的nooby问题,但是我如何在终端中输入4行命令?我应该把它做成一个脚本并从那里运行吗?只需键入4行即可。shell知道由于未关闭的报价单,它没有完成。您还可以将
awk
代码放入一个文件中,并使用
awk-f filename file2.csv file1.csv
grep -wf <(tr "," " " <file2) file1
awk 'BEGIN { FS=","; }
     NR == FNR { a[$1,$2]++; next; }
     FNR == 1 { FS=" "; }
     ($1,$2) in a' file2.csv file1.csv