次のサンプルデータがあります。
EMP_ID|EMP_NAME|AGE|SALARAy|DepId|DepName
123456|XXXXXXXXX|30|10000000|1234|XYZWE
次のコードを使用して、以下のようにデータを分割しています。
awk -F\| '
BEGIN { print "EMP_ID|Values|HeaderName" }
NR==1 { for(i=3;i<=NF;i++) h[i]=$i }
NR>1 { for(i=3;i<=NF;i++) print $1"|"$2"|"$i"|"h[i] }
' records.txt
そして出力IS
EMP_ID|EMP_NAME|Values|HeaderName
12345|XXXXXXXXX|30|AGE
12345|XXXXXXXXX|10000000|SALARY
12345|XXXXXXXXX|1234|DepID
12345|XXXXXXXXX|XYZWE|DepName
コマンドの最初と2番目の列から$ iとh [i]を追加して、 """ print $1"|"$2"|"$i"|"h[i] """を指定しました。 $1、$2 を指定する代わりに、より多くの列があるため、$1"|"$2"|"$3"|"$4... という言及が発生します。
すべての列名を順番に保持するのではなく、すべての範囲を参照できます。私は成功せず、次のコマンドを試しました。
for i in ${@:1:4}
$1"|"$2"|"$3"|"$4... を保持するのではなく、1:4 などの希望の範囲を指定できます。
ベストアンサー1
$ awk -F'|' '
BEGIN {
getline; split($0,a); OFS=FS;
print "EMP_ID", "EMP_NAME", "Values", "HeaderName"
}
{
for (i=3;i<=NF;i++) print $1, $2, $i, a[i];
}
' sample
EMP_ID|EMP_NAME|Values|HeaderName
123456|XXXXXXXXX|30|AGE
123456|XXXXXXXXX|10000000|SALARAy
123456|XXXXXXXXX|1234|DepId
123456|XXXXXXXXX|XYZWE|DepName
出力フィールドの範囲を同じヘッダーフィールド数に制限するには、に変更し、ループsplit($0,a)
終了条件を代わりに変更します。または、必要に応じて固定数字に変更してください。n = split($0,a)
for
i<=n
i<=NF