0

私は次のようにfile1を持っています:

ABC CDEF HAGD CBDGCBAHS:ATSVHC
NBS JHA AUW MNDBE:BWJW
DKW QDW OIW KNDSK:WLKJW
BNSHW JBSS IJS BSHJA
ABC CDEF CBS 234:ATSVHC
DKW QDW FSD 634:WLKJW

および file2:

ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253
KAB GCBS YSTW SHSEB:AGTW:THE:193

列 1、2、3、および 4 に基づいてファイル 1 とファイル 2 を比較したいのですが、file2 の列 4 には、比較するための拡張子が少しあります。

awk 'FNR==NR{seen[$1,$2,$3,$4;next} ($1,$2,$3,$4) in seen' file1 file2

出力が次のように file2 の一致する行になるように、比較可能にするために何を微調整できますか。

ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253
4

2 に答える 2

2

:FSに含めるだけです:

$ awk -F'[ :]' 'NR==FNR{a[$1,$2,$3,$4,$5];next} ($1,$2,$3,$4,$5) in a' file1 file2
ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253
于 2016-08-10T20:34:11.163 に答える
2

私が理解しているように、ファイル1の対応するフィールドに一致するフィールド1、2、3を持ち、ファイル1のフィールド4に一致するファイル2のフィールド4の先頭部分を持つファイル2からの行を印刷したいと考えています。その場合:

$ awk 'FNR==NR{seen[$1,$2,$3,$4];next} {a=$4; sub(/:[^:]*:[^:]*$/, "", a)} ($1,$2,$3,a) in seen' file1 file2
ABC CDEF HAGD CBDGCBAHS:ATSVHC:THE:123
NBS JHA AUW MNDBE:BWJW:THE:243
DKW QDW OIW KNDSK:WLKJW:THE:253

使い方

  • FNR==NR{seen[$1,$2,$3,$4];next}

    seen最初のファイル file1 を読み取るときに、最初の 4 つのフィールドに等しいキーを連想配列に追加します。次に、残りのコマンドをスキップして、そのnext行にジャンプします。

  • a=$4; sub(/:[^:]*:[^:]*$/, "", a)

    ここまで来たら、ファイル 2 に取り組んでいることを意味します。

    これにより、フィールド 4 の値が変数に割り当てられ、aコロンで区切られた最後の 2 つの文字列が から削除されますa

  • ($1,$2,$3,a) in seen

    これにより、最初の 3 つのフィールド とaが連想配列 のキーである file2 の任意の行が出力されseenます。

于 2016-08-10T20:19:30.730 に答える