我需要比较两个txt文件。两个 txt 文件的每一行都包含条目。每行一个条目。新文件包含旧文件缺少的条目。我尝试使用diff
andvimdiff
但这些不起作用,因为行的顺序可能不同。
例如:
旧文件
alpha
beta
gama
新文件
delta
omega
beta
alpha
gama
rho
phi
diff
并将vimdiff
第 1 行与第 1 行、第 2 行与第 2 行进行比较,即使我对两个文件进行排序,比较也不会成功,因为我可以在排序版本之间添加新项目,例如“alpha、beta、rho”与“alpha、贝塔、伽马、Rho”。
如何获取新文件有而旧文件没有的条目列表?
答案1
start cmd:> awk 'FNR == NR { oldfile[$0]=1; };
FNR != NR { if(oldfile[$0]==0) print; }' file1 file2
delta
omega
rho
phi
答案2
我会用grep
grep -Fxvf oldfile newfile
-F
:使用固定字符串模式(无元字符)
-x
:匹配整行(不是子字符串)
-f oldfile
:读取要匹配的字符串oldfile
-v
:反转匹配,即打印未在其中找到的字符串oldfile
答案3
更短的awk
命令:
awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2
如果file1
可以为空,则替换NR==FNR
为FILENAME==ARGV[1]
。
grep -Fxvf file2 file1
对于大文件来说速度很慢:
$ jot -r 10000 1 100000 >file1;jot -r 10000 1 100000 >file2
$ time awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2 >/dev/null
0.015
$ time grep -Fxvf file2 file1 >/dev/null
36.758
$ time comm -13 <(sort file1) <(sort file2)>/dev/null
0.173
如果需要删除重复的行,请使用
awk 'NR==FNR{a[$0];next}!b[$0]++&&!($0 in a)' file1 file2
或者
comm -13 <(sort file1) <(sort -u file2)
答案4
如果您需要这样做python
的方式。
#!/usr/bin/env python3.4
oldfp = open('/tmp/tmp.Q3JiYGY6fs/oldfile')
newfp = open('/tmp/tmp.Q3JiYGY6fs/newfile')
old = set([ x.strip() for x in oldfp.readlines() ])
new = set([ x.strip() for x in newfp.readlines() ])
print('Lines that are present only in newfile are \n{}\n\n{} '.format(42*'-', '\n'.join(list(new - old))))
输出将是
Lines that are present only in newfile are
------------------------------------------
phi
rho
omega
delta