2009-09-03 102 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