NR==FNR、2つのファイルが一致する場合は変更する必要があります[閉じる]

NR==FNR、2つのファイルが一致する場合は変更する必要があります[閉じる]

b.txtファイルの行が一致した場合、エントリ内のa.txt行を変更したいのですが(つまり、$ 1をb.txtファイルの$ 2に置き換えます)、うまくいきません。

入力する

*a.txt*
201 A B 580 D1
208 A B 581 D2
214 A B 582 D3

*b.txt*
10 101 E1 A Z1 B Z2 580 Z3
11 104 E2 C Z1 B Z2 581 Z3
12 107 E3 A Z1 B Z2 581 Z3
14 111 E3 B Z1 S Z2 582 Z3
15 116 E2 A Z1 B Z2 582 Z3

出力

*c.txt*
101 A B 580 D1
107 A B 581 D2
116 A B 582 D3
10 101 E1 A Z1 B Z2 580 Z3
12 107 E3 A Z1 B Z2 581 Z3
15 116 E2 A Z1 B Z2 582 Z3

私のコード

awk 'NR==FNR{pattern[$0]; next} {if($4" "$6" "$8 in pattern) {print $0; gsub(pattern[$1],$2); print pattern[$0]}}' a.txt b.txt >> c.txt

私のコードに何の問題がありますか?結果はありませんか?

ベストアンサー1

修正された質問に対する回答:

awk 'NR==FNR {$1=""; afile[$2, $3, $4]=$0; next; }
    (($4, $6, $8) in afile){ print $2 afile[$4, $6, $8]; }1' a.txt b.txt

以前のバージョンの質問に有効です。

$ awk 'NR==FNR { afile[$2, $3, $4]=1; next; } 
       (($4, $6, $8) in afile){ print $2, $4 ,$6 , $8; }1' a.txt b.txt >c.txt

a.txt2、3、4列のみという連想配列として読み込み、2番目のファイルの4、6、8afileでその列を比較し、配列にb.txt表示されている場合は、2番目のファイル$1全体を印刷します。必須列と残りの列4、6、8。そうでない場合、デフォルトは1一致しない行を印刷することです。

結果c.txt:

101 A B 580
10 101 E1 A Z1 B Z2 580 Z3
11 104 E2 C Z1 B Z2 581 Z3
107 A B 581
12 107 E3 A Z1 B Z2 581 Z3
14 111 E3 B Z1 S Z2 582 Z3
116 A B 582
15 116 E2 A Z1 B Z2 582 Z3

しかし、コードに問題があります。

awk 'NR==FNR{pattern[$0]; next} {if($4" "$6" "$8 in pattern) {print $0; gsub(pattern[$1],$2); print pattern[$0]}}' a.txt b.txt >> c.txt
  1. pattern[$0]:各行全体を追加できます。模様最初の入力""のa.txt関連配列。

  2. $4" "$6" "$8次に、2番目のファイルの列#4、#6、#8をb.txtその配列の行と比較します。行全体が存在しない特定の列値と比較されるため、一致しません。模様大量に。

  3. ステップ2は決して満足されないため、ifステートメントの内部ブロックは決して実行されません。

おすすめ記事