0

2 つのファイルが一致する場合、3 つのフィールド (ファイル 1 のフィールド 1,2, 5 とファイル 2 のフィールド 1,2,5) を使用して (コンマとスペースで区切られた) 2 つのファイルを比較しようとしています。 awk を使用した file1 の最後のファイル。たとえば、file1:

1, 4, abebe, kebede, 25, 101, 42
1, 4, abebe, debebe, 42, 201, 47
1, 4, abebech, kebede, 17, 33, 57

ファイル2:

1, 4, abebe, kebede, 25, 101, 42
1, 4, Tesse, debo, 25, 101, 42
1, 4, derartu, tulu, 25, 101, 42

出力:

42, 1, 4, abebe, kebede, 25, 101, 42
47, 1, 4, Tesse, debo, 25, 101, 42
57, 1, 4, derartu, tulu, 25, 101, 42

私はLinuxが初めてです....どんな助けも感謝しています

4

2 に答える 2

1

ファイル 1 のレコード 1 のフィールド 1、2、および 5 は、ファイル 2 のすべてのレコードと一致するため、必要な出力を得るために、ファイルを逆の順序で引数としてリストしました。

awk 'BEGIN {OFS = ", "} NR == FNR {a[$1, $2, $5] = $NF; next} $1 SUBSEP $2 SUBSEP $5 in a {print a[$1, $2, $5], $0}' file2 file1

このNR == FNRブロックは、引数リストの最初に現れるファイルを配列に読み取るループを形成します。レコード番号 ( NR) とファイル レコード番号 ( FNR) が等しくなくなった場合、処理は第 2 引数として指定されたファイルに進みます。

そこで、配列がチェックされ、2 つのファイルのフィールドが一致するかどうかが確認されます。その場合、対応する保存済みフィールドと現在のレコードが出力されます。

于 2012-06-12T16:25:39.577 に答える
1

問題を最初に読んだのは、この解決策に役立ちます。

awk '{getline t < "file2"; split( t, a );
    if( a[1]a[2]a[5] == $1$2$5) print $NF",", t}' file1

しかし、問題は実際には次のように思われます: 'file1フィールド 1、2、および 4 が同じであるすべてのレコードが最後のフィールドも同じであることがわかっている場合、file2対応するフィールド 1、2、および 4 を持つすべての行を見つけます。 4 そして、前に追加されたからの最終フィールドでその行を出力しますfile1。その場合、デニスによって与えられた解決策が機能します。

于 2012-06-12T16:17:07.560 に答える