如何在比较两个文件时从文件中删除行

How to eliminate lines from a file while comparing two files

我有两个文件,我需要一个输出文件,其中包含不在第一个文件中但在第二个文件中的所有内容,第二个文件包含第一个文件中的所有内容以及更多条目。 我试过了:

for j in `cat first`; do sed '/"$j"/d' second; done
cat first 
a
b
c
d
e
f
# cat second
a
1
b
22
33
c
44
d
11
e
44
f

@anubhava 的评论是一个很好的答案。

对于 comm,先忽略独特的,忽略常见的

comm --nocheck-order -13 first second

还有一个直接的 解决方案。

更新 1:超精简版

mawk ' NR==FNR { __[$_] } NF -= $_ in __' FS='^$' 
                                          test_first_file.txt 
                                          test_second_file.txt
    1
    22
    33
    44
    11
    44

————————————————————————————————

[m/n/g]awk '
BEGIN { FS="^$" } NR==1 { 
   do { __[$-_] } while ((getline)<=(FNR==NR))

} ($-_ in __)!=!___[$-_]-- ' test_first_file.txt test_second_file.txt

————————————————————————————————

1
22
33
44
11

我更喜欢@anubhava 的回答,它非常适合编写脚本。 但是,如果您只是想通过视觉辅助来查看两个文件之间的差异,那么旧的 diff 命令可能会有很大帮助。

$  diff -y first second
a                               a
                                  > 1
b                               b
                                  > 22
                                  > 33
c                               c
                                  > 44
d                               d
                                  > 11
e                               e
                                  > 44
f                               f

-y,或--side-by-side,分两列输出。

我也看过这个很棒的(完全归功于@Kent):

$ awk 'NR==FNR{a[]++;next;}!([=11=] in a)' first second
1
22
33
44
11
44

还有更多这样的命令:

  • colordiff - 类似 diff 但有颜色
  • cmp - 按字节比较文件
  • vimdiff - 使用 vim 编辑器的 diff

可能还有很多其他的好方法可以做到这一点,这些只是其中的一部分。

正在将我的评论转换为答案,以便未来的访问者可以轻松找到解决方案。

您可以使用这个 grep:

grep -vFxf first second

1
22
33
44
11

选项是:

  • -v: 选定的行是那些不匹配任何指定模式的行
  • -F:固定字符串搜索
  • -x: 完全匹配
  • -f: 为模式使用文件