如何使用bash找到某个文件中的哪些行不是由另一个文件中的行启动的?

时间:2012-12-02 17:45:27

标签: linux bash shell

我有两个文本文件,A和B:

A:

a start
b stop
c start
e start

B:

b
c

如何使用shell(bash ...)命令查找A中哪些行不是来自B的行。在这种情况下,我想得到这个答案:

a start
e start

我可以使用一行命令来实现吗?

3 个答案:

答案 0 :(得分:3)

这应该做:

sed '/^$/d;s/^/^/' B | grep -vf - A

sed命令将从文件/^$/d获取所有非空行(观察B命令)并在每行前面添加插入符号^(以便获得grep的正则表达式的锚点,并将所有这些都吐到stdout。然后grep,使用-f选项(这意味着从文件中获取所有模式,这里的stdin恰好是-,感谢-v符号)并进行反转匹配(感谢文件A上的{{1}}选项)。完成。

答案 1 :(得分:1)

我认为应该这样做:

sed 's/^/\^/g' B > C.tmp
grep -vEf C.tmp A
rm C.tmp

答案 2 :(得分:0)

您可以尝试结合使用xargscatgrep

将每行的第一个字母保存到FIRSTLETTERLIST中。您可以使用catsed工作进行此操作。

我的想法是采用黑名单,然后将其与有趣的文件进行匹配。

cat file1.txt | xargs grep ^[^[$FIRSTLETTERLIST]]

这是未经测试的,所以我不保证它会起作用,但它应该指向正确的方向。