2つのtxtファイルを比較する必要があります。両方のtxtファイルには、各行のエントリが含まれています。 1行に1つの項目があります。新しいファイルには、古いファイルから欠落しているエントリが含まれています。diff
試してみましたが、vimdiff
行の順序が異なる可能性があるため動作しません。
たとえば、
古いファイル
alpha
beta
gama
新しいファイル
delta
omega
beta
alpha
gama
rho
phi
diff
行1を行1と比較し、vimdiff
行2を行2と比較します。両方のファイルを並べ替えても、「alpha、beta、rho」と「alpha、beta」など、並べ替えられたバージョンの間に新しい項目を追加できるため、比較は成功しません。 、ガンマ、炉」。
新しいファイルにはあるが古いファイルにはないアイテムのリストをどのように取得できますか?
答え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
null にできる場合に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