2013-01-04 270 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