2009-09-03 57 views
3

我有4個文件按字母順序排序,A,B,C和D. 這些文件在每行上包含一個字符串。 從本質上講,需要做的是,B中得到任何東西從A 刪除的,其結果將在隨後C. 被剝奪的東西,同樣,那結果將被剝奪D.使用Linux命令對兩個文件執行「減」操作

是有一種使用Linux命令的方法?

+0

差異可能會起作用。你爲什麼給出提示但問問題?這是功課嗎? – 2009-09-03 01:20:45

+0

不是。事實上,如果你給它正確的標誌,差異將起作用。但我不確定旗幟。 – biznez 2009-09-03 01:33:59

回答

5

comm好這一點,無論是:

cat B C D | sort | comm -2 -3 A - 

或:

comm -2 -3 A B | comm -2 -3 - C | comm -2 -3 - D 

取決於什麼是更容易/更清晰的腳本。

+0

我想說這是迄今爲止給出的答案中最簡單的答案。 – 2009-09-03 02:10:48

2
grep -x -v -f B A | grep -x -v -f C | grep -x -v -f D 

-v開關是逆匹配(即匹配所有除外)。 -f開關將一個文件與一個模式列表進行匹配。 -x開關強制它匹配整行(以便作爲其他行的子字符串的行不會導致較長的行被刪除)。

1

看看join命令。閱讀它的手冊頁,你應該找到你想要的。

0
join A B | join - C | join - D 
+0

這不是完全相反,你想要什麼?這會給你所有四個文件中存在的行。此外,如果您的任何線條中有空格,則不起作用。 – 2009-09-03 02:00:22

+0

是的。對不起,直接加入應該這樣做。 – biznez 2009-09-03 02:03:02

+0

但仍然...我不是專家加入,但從閱讀手冊頁,加入AB會給你所有在A和B,而不是A,但不是B,這是你問的。從我可以告訴基於連接的答案到你原來的問題會是這樣的:'join -t \ n -v 1 A B | join -t \ n -v 1 - C | join -t \ n -v 1 - D' – 2009-09-03 02:07:54