我有2个csv文件。一个有几列,另一个只有一列有域。这些文件的简化数据将是
file1.csv:
John,example.org,MyCompany,Australia
Lenny,domain.com,OtherCompany,US
Martha,site.com,ThirdCompany,US
file2.csv:
example.org
google.es
mysite.uk
输出应为
Lenny,domain.com,OtherCompany,US
Martha,site.com,ThirdCompany,US
我试过这个解决方案
grep -v -f file2.csv file1.csv >output-file
但是由于没有任何关于脚本如何工作的解释,而且我对shell很糟糕,我无法调整它以使其适用于我
对此的解决方案将受到高度赞赏,有一些解释的解决方案将是非常棒的! :)
编辑:
我已经尝试过想要工作的线路,但由于某种原因它没有。这是我终端的输出。这有什么问题?
Desktop $ cat file1.csv ; echo
John,example.org,MyCompany,Australia
Lenny ,domain.com,OtherCompany,US
Martha,mysite.com,ThirCompany,US
Desktop $ cat file2.csv ; echo
example.org
google.es
mysite.uk
Desktop $ grep -v -f file2.csv file1.csv
John,example.org,MyCompany,Australia
Lenny ,domain.com,OtherCompany,US
Martha,mysite.com,ThirCompany,US
为什么grep
不会删除该行
John,example.org,MyCompany,Australia
答案 0 :(得分:0)
一个在awk中:
$ awk -F, 'NR==FNR{a[$1];next}($2 in a==0)' file2 file1
Lenny,domain.com,OtherCompany,US
Martha,site.com,ThirdCompany,US
说明:
$ awk -F, ' # using awk, comma-separated records
NR==FNR { # process the first file, file2
a[$1] # hash the domain to a
next # proceed to next record
}
($2 in a==0) # process file1, if domain in $2 not in a, print the record
' file2 file1 # file order is important
答案 1 :(得分:0)
你发布的那条线,效果很好。
$ grep -v -f file2.csv file1.csv
Lenny,domain.com,OtherCompany,US
Martha,site.com,ThirdCompany,US
这是一个解释。 grep
将搜索给定文件中的给定模式并打印匹配的所有行。最简单的用法示例是:
$ grep John file1.csv
John,example.org,MyCompany,Australia
这里我们使用了一个匹配每个字符的简单模式,但你也可以使用正则表达式(基本的,扩展的,甚至是perl兼容的)。
要反转逻辑,只打印不匹配的行,我们使用-v
开关,如下所示:
$ grep -v John file1.csv
Lenny,domain.com,OtherCompany,US
Martha,site.com,ThirdCompany,US
要指定多个模式,您可以多次使用-e pattern
选项,如下所示:
$ grep -v -e John -e Lenny file1.csv
Martha,site.com,ThirdCompany,US
但是,如果要检查的模式数量较多,我们可能会使用-f file
选项读取指定的file
中的所有模式。
所以,当我们将所有这些结合起来时;从-f
的文件中读取模式并将匹配逻辑反转为-v
,我们得到您需要的行。