使用逆grep比较两个.text文件

时间:2014-07-31 19:55:44

标签: unix terminal grep

我有两个.txt文件" test1.txt"和" test2.txt"我想使用逆grep(UNIX)来查找test2.txt中不包含test1.txt中任何行的所有行

test1.txt仅包含用户名,而test2.txt包含更长的文本字符串。我只希望test2.txt中的行不包含test1.txt中找到的用户名

它会是什么样的?

grep -v test1.txt test2.txt > answer.txt

3 个答案:

答案 0 :(得分:2)

你几乎在那里错过了你命令中的一个选项(即-f) 您的解决方案应使用-f标志,请参阅下面的示例会话以演示相同的

演示会议

    $ # first file
    $ cat a.txt
    xxxx yyyy
    kkkkkk
    zzzzzzzz

    $ # second file
    $ cat b.txt
    line doesnot contain any name
    This person is xxxx yyyy good
    Another line which doesnot contain any name
    Is kkkkkk a good name ?
    This name itself is sleeping ...zzzzzzzz
    I can't find any other name
    Lets try the command now

    $ # -i is used to ignore the case while searching
    $ # output contains only lines from second file not containing text for first file lines
    $ grep -v -i -f a.txt b.txt
    line doesnot contain any name
    Another line which doesnot contain any name
    I can't find any other name
    Lets try the command now

答案 1 :(得分:0)

你使用什么样的unix?这将使我们从命令行更好地了解您可以使用的内容。目前你所拥有的东西不起作用,你正在寻找比较两个文件的diff命令。

您可以在OS X 10.6上执行以下操作。我已在家中对此进行了测试。

diff -i -y FILE1 FILE2

diff比较文件-i会忽略这种情况,如果这无关紧要,那么Hi和HI仍然意味着相同。最后-y将并排输出结果如果您想将信息输出到文件,您可以diff -i -y FILE1 FILE2 >> /tmp/Results.txt

答案 2 :(得分:0)

他们可能是更好的方法来做到这一点,即。没有grep但是会有一个可行的解决方案

grep -v -P "($(sed ':a;N;$!ba;s/\n/)|(/g' test1.txt))" test2.txt > answer.txt

解释一下:

$(sed ':a;N;$!ba;s/\n/)|(/g' test1.txt)是一个嵌入式sed命令,它输出一个字符串,其中test1.txt中的每个换行符都被)|(替换,然后将输出插入到perl样式的正则表达式(-P)中要使用grep,以便grep在text1.txt中的每一行搜索test2.txt,并仅返回test2.txt中由于-v param而在test1.txt中不包含行的那些。