我有一个新文件,其中包含以下数据,以回车符分隔
a
a
b
c
d
d
我有一个旧文件,也是用回车符分隔的
b
d
如何从新文件中删除 b 和 d 并从第一个文件中删除其中一个 a?
所需的输出(以回车符分隔)将是
a
c
我尝试使用 sort -u 删除 b 和 d,但也删除 a a。我尝试使用 grep -vxFf,但是新文件中有重复项。
答案1
grep -F -f oldfile -v newfile | uniq
使用旧文件作为 grep 的搜索,最后删除重复的行。
答案2
使用,仅打印之前在任一文件中未出现过的awk
行:newfile
awk '!(seen[$0]++ || NR==FNR)' oldfile newfile
答案3
如果您可以对文件进行排序(我假设您已经尝试过sort -u
),则可以运行comm oldfile.sorted newfile.sorted
,它将以三列显示内容 - 仅旧文件、仅新文件、两个文件。-1
、-2
、-3
选项允许您隐藏某些列,因此comm -13 oldfile.sorted newfile.sorted | uniq
应该可以满足您的要求。
答案4
在perl
:
perl -ne 'print if ! ( $seen{$_}++ || $#ARGV eq 0 )' oldfile newfile
或者:
perl -ne '( $seen{$_}++ || $#ARGV eq 0 ) || print' oldfile newfile