awkを使用した動的数の列を含むマップファイルの処理

awkを使用した動的数の列を含むマップファイルの処理

次の情報をどのように処理するかを知りたいです。

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番目の列から最後の列まで(-現在のレコードのフィールド数)。xmapping.txtnextxxsplitNF

関連情報