各レコード行に印刷されるパラメーターの範囲を指定します。

各レコード行に印刷されるパラメーターの範囲を指定します。

次のサンプルデータがあります。

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)fori<=ni<=NF

おすすめ記事