1

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 には出力されません。異なる場合にのみ印刷されます。どうすればこれを達成できますか?

どうもありがとうございました。

4

2 に答える 2

4

diff2 つのファイルの違いを示す ために使用します。

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

于 2013-11-15T05:54:29.017 に答える
3

おそらく最善の策は、2 つのファイルを並べ替えてcomm結果を実行することです。bashシェルとして持っている場合は、 Process Substitutionを使用できます。

comm -3 <(sort a.unl) <(sort b.unl)

これにより、 に含まれるが含まれないすべての行、 に含まれるa.unlが含まれないb.unlすべての行b.unla.unl出力されます (タブでインデントされます)。は、と-3の両方の行を抑制します。a.unlb.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
于 2013-11-15T04:18:46.427 に答える