我用这个命令比较两个文件
comm -13 file1 file2
它工作得很好,告诉我不同之处。但我也想给我看行号(第二个文件中唯一的行(。
文件1:
a
d
e
f
g
文件2:
a
b
c
d
e
我知道:
comm -13 file1 file2
输出
b
c
但我需要文件2中b和c所在的行号,所需输出:
2
3
使用awk:
$ awk 'NR==FNR{a[$0];next}!($0 in a){print FNR}' file1 file2
输出:
2
3
编辑:如OP所示,当文件file2
重复时,comm
的行为会有所不同。下面的解决方案应该可以解决这个问题(见评论和感谢@EdMorton(:
$ awk '
NR==FNR {
a[$0]++
next
}
{
if(!($0 in a)||a[$0]<=0)
print FNR
else a[$0]--
}' file1 file2
现在输出(file2
有一个重复的条目d
,其中FNR==5
(:
2
3
5
希望没有那么多陷阱在等待。。。
awk 'NR==FNR{a[$0]++; next} (--a[$0]) < 0{print FNR}' file1 file2
例如,使用包括额外d
行的修改后的file2
来证明重复值被正确处理:
$ cat file2
a
b
c
d
d
e
$ comm -13 file1 file2
b
c
d
$ awk 'NR==FNR{a[$0]++; next} (--a[$0]) < 0' file1 file2
b
c
d
$ awk 'NR==FNR{a[$0]++; next} (--a[$0]) < 0{print FNR}' file1 file2
2
3
5