a.unl と b.unl の 2 つのファイルがあります。内容は次のとおりです。
#a.unl
300111
302130
300042
300054
400045
#b.unl
200032
300042
300111
565000
310056
そして、違いをキャッチする c.unl があります。a.unl の行が b.unl の行と一致する場合、c.unl には出力されません。異なる場合にのみ印刷されます。どうすればこれを達成できますか?
どうもありがとうございました。
diff
2 つのファイルの違いを示す ために使用します。
diff -u a.unl b.unl
出力は次のようになります。
--- a.unl 2013-11-15 13:51:00.936845493 +0800
+++ b.unl 2013-11-15 13:51:21.373908098 +0800
@@ -1,5 +1,5 @@
+200032
+400042
300111
-302130
-300042
-300054
-400045
+565000
+310056
-
a.unl からの削除を意味し、a.unlへの+
追加を意味します。詳細を取得するために
使用します。man diff
おそらく最善の策は、2 つのファイルを並べ替えてcomm
結果を実行することです。bash
シェルとして持っている場合は、 Process Substitutionを使用できます。
comm -3 <(sort a.unl) <(sort b.unl)
これにより、 に含まれるが含まれないすべての行、 に含まれるa.unl
が含まれないb.unl
すべての行b.unl
がa.unl
出力されます (タブでインデントされます)。は、と-3
の両方の行を抑制します。a.unl
b.unl
持っていない場合はbash
、おそらく次のようなものが必要です。
sort a.unl > a.srt
sort b.unl > b.srt
comm -3 a.srt b.srt
rm -f a.srt b.srt
それをより防爆に近づけるには(物事を中断した場合に中間ファイルを残さないようにするため)、次のものが必要です。
tmp=tmp.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15
sort a.unl > $tmp.a
sort b.unl > $tmp.b
comm -3 $tmp.a $tmp.b
rm -f $tmp.?
trap 0