比较两个不同长度的CSV文件,但仅输出与两个不同列中的相同值匹配的行

yshpjwxd  于 2022-10-23  发布在  Linux
关注(0)|答案(3)|浏览(186)

我一直试图使用简单的外壳脚本比较两个CSV文件,但我认为我使用的代码不能完成它的工作。我想要做的是,使用first.csv中的第6列和secud.csv中的第2列比较这两个文件,当匹配时,它将输出first.csv中的行。请看下面的示例

First.csv

1,0,3210820,0,536,7855712
1,0,3523340820,0,36,53712
1,0,321023423i420,0,336,0255712
1,0,321082234324,0,66324,027312

Second.csv

14,7855712,Whie,Black
124,7855712,Green,Black
174,1197,Black,Orange
1284,98132197,Yellow,purple
35384,9811123197,purple,purple
13354,0981123131197,green,green
183434,0811912313127,white,green

输出应来自第一个文件:

1,0,3210820,0,536,7855712

我一直在使用下面的代码。

cat first.csv | while read line    
do    
  cat second.csv | grep $line > output_file    
done

请帮帮忙。谢谢

zfciruhq

zfciruhq1#

你的问题并不完全清楚,但我认为你想要的是:

cat first.csv | while read LINE; do
    VAL=`echo "$LINE" | cut -d, -f6`
    grep -q "$VAL" second.csv && echo $LINE
done

循环中的第一行从该行提取第6个字段并将其存储在val中。下一行检查(悄悄地)是否在ond d.csv中出现val,如果出现,则输出该行。
请注意,grep将检查secud.csv中的所有匹配项,而不仅仅是字段2。要仅检查字段2,请将其更改为:

cut -d, -f2 second.csv | grep -q "$VAL" && echo $LINE

与你的问题无关,我想评论一下,这些事情可以用一种像Python语言更高效地解决。

gupuwyp2

gupuwyp22#

好吧..。如果您有带有PROCESS SUBSITION的bash,则可以将second.csv中的所有第二个字段(在行尾附加一个$以锚定搜索)视为来自文件的输入。然后使用grep -fsecond.csv第2列中的数据与first.csv中的行尾进行匹配。
您可以使用<(process)表单将第二个字段重定向为文件,方法是:

grep -f <(awk -F, '{print $2"$"}' second.csv) first.csv

输出示例

使用first.csvsecond.csv中显示的数据,您将获得:

1,0,3210820,0,536,7855712

"$"锚添加为来自second.csv的第二个场的一部分应该只满足first.csv中的第六个场(行尾)的匹配。
这里的好处是只有一个对grepawk的调用,而不是每次迭代产生的附加子外壳。对于像您的样本输入这样的小文件并不重要,但是对于数百万行的文件,我们谈论的是几个小时(或几天)的处理时间差异。

3ks5zfa0

3ks5zfa03#

rq(https://github.com/fuyuncat/rquery/releases)可以很好地做到这一点。
它可以像SQL一样连接比较多个文件的内容。

[ rquery]$ ./rq -q "p d/,/ | m @2 where @fileid=1 | s @raw | f @fileid=2 and @6=@r[1][1]" samples/second.csv samples/first.csv
1,0,3210820,0,536,7855712

相关问题