如何在比较两个文件时从文件中删除行
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
还有一个直接的 awk 解决方案。
更新 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
: 为模式使用文件
我有两个文件,我需要一个输出文件,其中包含不在第一个文件中但在第二个文件中的所有内容,第二个文件包含第一个文件中的所有内容以及更多条目。 我试过了:
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
还有一个直接的 awk 解决方案。
更新 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
: 为模式使用文件