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.txt
2、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
pattern[$0]
:各行全体を追加できます。模様最初の入力""のa.txt
関連配列。$4" "$6" "$8
次に、2番目のファイルの列#4、#6、#8をb.txt
その配列の行と比較します。行全体が存在しない特定の列値と比較されるため、一致しません。模様大量に。ステップ2は決して満足されないため、ifステートメントの内部ブロックは決して実行されません。