问题:
示例演示
假设这两个文件是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结果什么都没有。
发布于 2016-05-28 20:30:47
用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发布于 2016-05-28 19:59:05
从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 >>test2grep选项
grep通常会打印匹配的线条。-v告诉grep做相反的事情:它只打印不匹配的行。
-x告诉grep做全线匹配.
-F告诉grep我们使用的是固定字符串,而不是正则表达式。
-f test2告诉grep从test2文件读取那些固定的字符串,每行一个。
发布于 2016-05-28 21:04:09
1和2问题的解决方案。
diff test1 test2 |grep "<"|sed 's/< \+//g' > test1.tmp|mv test1.tmp test1这是输出
$ cat test1
www.xyz.com/abc-1三个问题的解决方案。
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-1https://stackoverflow.com/questions/37503186
复制相似问题