2012-06-05 114 views
2

希望有人能幫助。sed,awk,grep匹配word 2文件

我有兩個文件。 file-a看起來像

bank 
    sofa 
    table 

file-b是一個 「腳本」。 的例子,它看起來像:

abcdfg bank 
    kitchen abcdfg 
    uhuh sofa := 

我只需要知道在file-a的話不符合任何單詞file-b和打印這file-c

我知道必須這樣做,在一個單一的文件,但不是如何將其與另一個文件進行比較。

我感謝您的幫助。

+0

銀行?你的意思是「凳子」 – brandizzi

回答

1

在兩步:

fgrep -f file-a -o file-b > this_words_from_file-a_are_in_file-b 
sort file-a this_words_from_file-a_are_in_file-b | uniq -u 

(第一對詞語的搜索然後輸出僅發現的,然後用sortuniq過濾掉那些。)

+0

謝謝洛特......它的作品! – Quinox

+2

在這種情況下,您可能需要閱讀常見問題解答:http://stackoverflow.com/faq#reputation –

0
join -1 1 -2 2 -v 1 <(sort file-a) <(sort -k2,2 file-b) > file-c 
0
> fileC; cat fileA | while read ZWORD ; do fgrep -q "$ZWORD" fileB || echo $ZWORD >>fileC; done 
$ cat fileC 
table 

線索

  • > fileC創建一個空文件
  • read讀取一行的fileA並將其放入可變ZWORD
  • fgrep不評價$ZWORD作爲正則表達式
  • -q是安靜
  • ||執行上述命令失敗時
+0

請注意,這會爲每個單詞創建一個新的'fgrep'(子)過程...並且可以幫助您識別該單詞整個文件一次又一次。 –

1
fgrep -of file-a file-b | fgrep -vf - file-a 

首先查找file-a中文件b中的所有單詞,然後再次使用fgrep從文件a中獲取不在該列表中的單詞。

1

這不會贏得代碼高爾夫,但它使對數據只有一個通道,不浪費任何CPU時間排序:

awk '{ for(i=1; i<=NF; i++) if(NR==FNR) w[$i]=1; else delete w[$i] } 
    END{ for(i in w) print i}' file-a file-b > file-c 

注意,增速是巨大的。對於file-afile-b作爲/usr/share/dict/words,這個awk解決方案在1.578s的系統上運行。約翰勞倫斯的fgrep解決方案的時間:9.157s。時間Zsolt的fgrep | uniq:4.951。