使用来自另一个csv

时间:2017-10-26 17:55:47

标签: linux bash csv awk grep

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

RED 4 VWX
BLUE 2 MNO
BLUE 7 DEF
PURPLE 6 JKL
BLACK 8 VWX
BROWN 1 MNO
RED 1 GHI
RED 7 ABC

以下文件2.csv(逗号分隔):

BROWN,2
RED,5
YELLOW,8

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

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

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

2 个答案:

答案 0 :(得分:1)

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列,值为item number

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

只需使用 grep

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

我们正在使用,替换file2中的空格tr,并使用file1-f中的每一行作为模式进行搜索由我们可爱的grep

提供的选项

-w与字词边界匹配,因此ABC 1ABC 123不匹配

答案 1 :(得分:0)

您可以使用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时,第三行将字段分隔符更改为空格,最后一行匹配前两个字段是数组中键的任何行。