将新 txt 文件与旧 txt 文件进行比较,并删除所有匹配的数据

将新 txt 文件与旧 txt 文件进行比较,并删除所有匹配的数据

我有一个新文件,其中包含以下数据,以回车符分隔

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

相关内容