我一直试图使用简单的外壳脚本比较两个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
请帮帮忙。谢谢
3条答案
按热度按时间zfciruhq1#
你的问题并不完全清楚,但我认为你想要的是:
循环中的第一行从该行提取第6个字段并将其存储在val中。下一行检查(悄悄地)是否在ond d.csv中出现val,如果出现,则输出该行。
请注意,grep将检查secud.csv中的所有匹配项,而不仅仅是字段2。要仅检查字段2,请将其更改为:
与你的问题无关,我想评论一下,这些事情可以用一种像Python语言更高效地解决。
gupuwyp22#
好吧..。如果您有带有PROCESS SUBSITION的bash,则可以将
second.csv
中的所有第二个字段(在行尾附加一个$
以锚定搜索)视为来自文件的输入。然后使用grep -f
将second.csv
第2列中的数据与first.csv
中的行尾进行匹配。您可以使用
<(process)
表单将第二个字段重定向为文件,方法是:输出示例
使用
first.csv
和second.csv
中显示的数据,您将获得:将
"$"
锚添加为来自second.csv
的第二个场的一部分应该只满足first.csv
中的第六个场(行尾)的匹配。这里的好处是只有一个对
grep
和awk
的调用,而不是每次迭代产生的附加子外壳。对于像您的样本输入这样的小文件并不重要,但是对于数百万行的文件,我们谈论的是几个小时(或几天)的处理时间差异。3ks5zfa03#
rq
(https://github.com/fuyuncat/rquery/releases)可以很好地做到这一点。它可以像SQL一样连接比较多个文件的内容。