0

2 つのファイルがあるとします。

ファイル1:

1|abc
2|cde
3|pkr

ファイル 2:

1|abc
2|cde
4|lkg

を使用して両方のファイルの真の違いをリストするにはどうすればよいawkですか? 2番目のファイルが最初のファイルのサブセットである場合、次のことができます-

awk -F"|" 'NR==FNR{a[$1]=$2;next} !($1 in a)' file{1,2}

しかし、これは私に与えるだろう

4|lkg

それが本当の違いなので、次のように出力したいと思います。違いは次のようになります。

3|pkr
4|lkg

違いの基準:

  • フィールド 1 は file1 に存在しますが、file2 には存在しません。
  • フィールド 1 は file2 に存在しますが、file1 には存在しません。
  • フィールド 1 は両方のファイルに存在しますが、値が異なります。

背景:

ファイル 1 とファイル 2 は、異なるデータベースからエクスポートされたテーブルです。パイプ区切り文字で区切られた 2 つのフィールドがあります。フィールド 1 は常に一意です。フィールド 2 は同じである可能性があります。

私の意図は、awk真の違いを見つけるために 1 つのライナーを実行することです。上記のコマンドを 2 回実行すると (最初の実行では最初にファイル 1 を渡し、2 回目の実行では最初にファイル 2 を渡します)、両方で欠落しているレコードを取得します。ただし、これをシングルパスで行いたいです。

4

3 に答える 3

4

本当に awk を使いたい場合:

$ cat f1
a|1
b|2
c|1
$ cat f2
b|2
c|1
d|0
$ awk '{ h[$0] = ! h[$0] } END { for (k in h) if (h[k]) print k }' f1 f2
a|1
d|0
$
于 2013-03-21T13:22:27.357 に答える
3

これは何をするかcommです:

$ comm -3 <(sort file1) <(sort file2)

saya|1が にfile11 回とfile22 回ある場合a|1、 の発生の 1 つだけfile2が に一致したため、 が出力に 1 回表示されfile1ます。この動作とa|1それが必要ない場合は、出力に表示されるべきではないため、それぞれに少なくとも 1 回表示されるため、次の-uオプションを使用しますsort

$ comm -3 <(sort -u file1) <(sort -u file2)
于 2013-03-21T13:33:28.187 に答える
1
diff file1 file2 | perl -lne 'if(/^[<>]/){s/^..//g;print}'

以下はテストです:

> cat file1
a|1
b|2
c|1
> cat file2
b|2
c|1
d|0
> diff file1 file2 | perl -lne 'if(/^[<>]/){s/^..//g;print}'
a|1
d|0
> 
于 2013-03-21T13:33:22.290 に答える