按行比较两个文件并从第一个文件中删除重复项

时间:2016-05-28 19:46:11

标签: bash unix grep

问题:

  1. 需要比较两个文件,
  2. 从第一个文件中删除副本
  3. 然后将file1的行附加到file2
  4. 逐个插图

    假设,这两个文件是test1和test2。

    $ cat test2
    www.xyz.com/abc-2
    www.xyz.com/abc-3
    www.xyz.com/abc-4
    www.xyz.com/abc-5
    www.xyz.com/abc-6
    

    test1是

    $ cat test1
    www.xyz.com/abc-1
    www.xyz.com/abc-2
    www.xyz.com/abc-3
    www.xyz.com/abc-4
    www.xyz.com/abc-5
    

    将test1与test2进行比较并从测试1中删除重复项

    结果要求:

    $ cat test1
    www.xyz.com/abc-1
    

    然后将此test1数据添加到test2

    $ cat test2
    www.xyz.com/abc-2
    www.xyz.com/abc-3
    www.xyz.com/abc-4
    www.xyz.com/abc-5
    www.xyz.com/abc-6
    www.xyz.com/abc-1
    

    解决方案:

    join -v1 -v2 <(sort test1) <(sort test2)
    

    导致了这个(输出错误)

    $ join -v1 -v2 <(sort test1) <(sort test2)
    www.xyz.com/abc-1
    www.xyz.com/abc-6
    

    我尝试的另一个解决方案是:

    fgrep -vf test1 test2
    

    没有任何结果。

4 个答案:

答案 0 :(得分:3)

使用awk:

% awk 'NR == FNR{ a[$0] = 1;next } !a[$0]' test2 test1
www.xyz.com/abc-1

故障:

NR == FNR { # Run for test2 only
  a[$0] = 1 # Store whole line as key in associative array
  next      # Skip next block
}
!a[$0]      # Print line from test1 that are not in a

答案 1 :(得分:2)

从test1中删除行,因为它们位于test2中:

$ grep -vxFf test2 test1
www.xyz.com/abc-1

要覆盖test1:

grep -vxFf test2 test1 >test1.tmp && mv test1.tmp test1

将新test1追加到test2的末尾:

cat test1 >>test2

grep选项

grep通常会打印匹配的行。 -v告诉grep反过来:它只打印与

不匹配的行

-x告诉grep进行全线比赛。

-F告诉grep我们使用的是固定字符串,而不是正则表达式。

-f test2告诉grep从文件test2读取那些固定字符串,每行一个。

答案 2 :(得分:2)

解决1和2问题。

diff test1 test2 |grep "<"|sed  's/< \+//g' > test1.tmp|mv test1.tmp test1

这是输出

$ cat test1
www.xyz.com/abc-1

解决3个问题。

cat test1 >> test2

这是输出

$ cat test2
www.xyz.com/abc-2
www.xyz.com/abc-3
www.xyz.com/abc-4
www.xyz.com/abc-5
www.xyz.com/abc-6
www.xyz.com/abc-1

答案 3 :(得分:0)

如果每个文件中的行是唯一的,如示例输入中所示,那么,由于您已经在尝试的解决方案中对输入文件进行排序,因此排序的输出必须正常,这就是您所需要的:

$ sort -u test1 test2
www.xyz.com/abc-1
www.xyz.com/abc-2
www.xyz.com/abc-3
www.xyz.com/abc-4
www.xyz.com/abc-5
www.xyz.com/abc-6

如果您还需要其他内容,请编辑您的问题以澄清您的要求,并提供可能导致其中断的示例输入/输出。