与另一个文件相比查找一个文件中的新行

与另一个文件相比查找一个文件中的新行

我需要比较两个txt文件。两个 txt 文件的每一行都包含条目。每行一个条目。新文件包含旧文件缺少的条目。我尝试使用diffandvimdiff但这些不起作用,因为行的顺序可能不同。

例如:

旧文件

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==FNRFILENAME==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

相关内容