次の情報をどのように処理するかを知りたいです。
mapping.txt
:
80 001 002
81 011 012 013 014
82 021 022
...
input.txt
:
81 103823044
80 103823054
81 103823064
...
期待するoutput.txt
:
103823044|011|
103823044|012|
103823044|013|
103823044|014|
103823054|001|
103823054|002|
103823064|011|
103823064|012|
103823064|013|
103823064|014|
列番号が固定された単純なマッピングを実行しましたが、動的列番号を目的の出力にマッピングする方法がわかりません。
答え1
次のことを試すことができます。
awk 'NR == FNR { x[$1,$2] = $1; next; } { for (i in x) { if (x[i] == $1) { split(i,t,SUBSEP); for (z = 2; z <= NF; z++) { print t[2] "|" $z "|"; } } } }' input.txt mapping.txt
ファイルを読み込むと、最初のブロックが実行されますinput.txt
。これは、最初のファイルを読み取るときの条件によってNR == FNR
達成されます。最初のブロックでは、最初と2番目の列のキーと1番目の列の値でtrue
配列を作成します。最初のブロックにあるので、2番目のブロックがファイルで実行されます。 2番目のブロックでは、最初の列の値が配列の値として存在するかどうか、配列の各キーを確認し、その場合はキーの2番目の部分を抽出し、値の値とともにループからその値を印刷します。 2番目の列から最後の列まで(-現在のレコードのフィールド数)。x
mapping.txt
next
x
x
split
NF