问题:
逐个插图
假设,这两个文件是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
没有任何结果。
答案 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通常会打印匹配的行。 -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
如果您还需要其他内容,请编辑您的问题以澄清您的要求,并提供可能导致其中断的示例输入/输出。