2013-01-04 229 views
1

我想有一个shell脚本,搜索两个文件,并返回一个字符串列表:搜索字符串

文件只包含一个唯一的字母数字字符串列表,每行一个,像这样:

accc_34343 
GH_HF_223232 
cwww_34343 
jej_222 

文件B包含其中一些字符串列表(有时不止一次),和信息来源的第二列,例如:

accc_34343 dog 
accc_34343 cat 
jej_222 cat 
jej_222 horse 

我想创建一个包含第三个文件文件A中不在文件B中的字符串列表。

我试过用grep -v使用一些循环,但那不起作用。因此,在上面的示例中,新文件会包含以下内容:

GH_HF_223232 
cwww_34343 

任何帮助都非常感谢!

+0

http://theunixshell.blogspot.in/2012/12/file-comparisons-using-awk-match-columns .html – Vijay

回答

2

这里是你可以做什么:

grep -v -f <(awk '{print $1}' file_b) file_a > file_c 

说明:

  • grep -v:使用-v选项grep到匹配的
  • -f反转:使用-f选项grep指定该模式来自文件
  • <(awk '{print $1}' file_b)<(awk '{print $1}' file_b)是简单地从file_b中提取第一列值而不使用临时文件; <(...)语法是process substitution
  • file_a:告诉grep将要搜索的文件是file_a
  • > file_c:输出能写入到file_c
+0

亲爱的桑普森陈,这工作很好。在具有几千个条目的文件中,处理时间少于10秒。谢谢! –

+0

@AnnieCarvalstein我很高兴它帮助! =) –

1

comm用于文件之间找到交叉点和不同点:

comm -23 <(sort fileA) <(cut -d' ' -f1 fileB | sort -u) 

结果:

GH_HF_223232 
cwww_34343 

我假设你的shell是bash/zsh,使用/ KSH

0
awk 'FNR==NR{a[$0];next}!($1 in a)' fileA fileB 

检查here