1

私は2つの部分からなるawkの問題を抱えています:

最初の部分: 2 つのファイルの 2 番目の列を比較したい。一致する場合は、対応する値を出力ファイルに出力します。

2 番目の部分では、反対の情報も必要です。繰り返しますが、同じ 2 つのファイルの 2 番目の列を比較したいと思います。一意の文字列値がある場合 (ファイル 2 の列 2 ではなく、ファイル 1 の列 2 に表示されるものを意味します)。

最初の部分を解決するには: 次の awk を使用しました

awk 'NR==FNR { a[$1]=$2; next} $1 in a {print $0, a[$1]}' File2 File1

ここにあり、一致する値を識別する問題を解決しているようです。

ただし、ファイル 1 から一意の情報を識別し、それを 3 番目の出力ファイルに出力する解決策が見つからないようです。これを解決する方法について誰かが洞察を提供できますか?

入力の例は次のとおりです。

ファイル 1

A   concept1    123
A   concept2    123
A   concept1    123
A   concept1    123
A   concept3    123

ファイル 2

B   concept1    456
B   concept4    456
B   concept5    456
B   concept1    456
B   concept3    456

出力ファイル 3

concept4
concept5

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

更新: オリジナルでは、1 つのファイルを他の 1 つのファイルと比較する質問をしました。このコードを変更して、1 つのファイルを他の複数のファイルと比較することはできますか?

例えば:

入力: FILE2、FILE3、FILE4...FILEn に対して一意の行を比較する FILE1 出力: FILE1 からのすべての一意の行を含む FILE。

4

2 に答える 2

1

IIUC あなたは間違った方法でそれを行っています。$1配列へのインデックスとして使用していますが、これはすべてのレコードで同じです。

小さな入力ファイル

問題への 1 つのアプローチは、2 番目の列を に保存し、a2 番目のファイルに対してチェックすることです。このようなもの:

awk 'NR==FNR { a[FNR]=$2; next} $2 != a[FNR] { print $2 }' File1 File2

出力:

concept4
concept5

大きな入力ファイル

入力ファイルが非常に大きい場合、上記のアプローチは大量のメモリを使用します。その場合、より良い方法は、次のように入力を前処理することです。

paste <( <File1 tr -s ' ' | cut -d' ' -f2) \
      <( <File2 tr -s ' ' | cut -d' ' -f2) | 
  awk '$1 != $2 { print $2 }'

出力:

concept4
concept5
于 2013-10-11T14:25:16.983 に答える
1

投稿されたサンプル入力ファイルが与えられた場合:

$ awk 'NR==FNR{seen[$2]++;next} seen[$2]{print $2}' file1 file2
concept1
concept1
concept3

$ awk 'NR==FNR{seen[$2]++;next} !seen[$2]{print $2}' file1 file2
concept4
concept5

$ awk 'NR==FNR{seen[$2]++;next} !seen[$2]{print $2}' file2 file1
concept2
于 2013-10-11T18:19:39.533 に答える