Linuxでピボットテーブルを実行して、1つのレコードを複数のレコードに変換できますか?

Linuxでピボットテーブルを実行して、1つのレコードを複数のレコードに変換できますか?

私たちは以下のデータを持っています

 ABC|RAM|BANGALORE|100,200,300

上記のデータを複数のレコードに分割するためにピボット/ループを実行できますか?

ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300

最後の列にカンマ区切り文字を含む複数の値に基づいてレコード数を生成する必要があります。

Linuxシェルでできることはありますか?

ベストアンサー1

私はこれにシェル自体を使用しません。

別のawkの実装

$ awk 'BEGIN{OFS=FS="|"} {split($NF,a,","); for(i in a) {$NF = a[i]; print}}' data
 ABC|RAM|BANGALORE|100
 ABC|RAM|BANGALORE|200
 ABC|RAM|BANGALORE|300

またはミラー

$ mlr --nidx --fs '|' nest --explode --values --across-records --nested-fs ',' -f 4 data
 ABC|RAM|BANGALORE|100
 ABC|RAM|BANGALORE|200
 ABC|RAM|BANGALORE|300

またはよりコンパクト

mlr --nidx --fs '|' nest --evar ',' -f 4 data

もしあなたなら本物シェルを使用してから最近のbashを使用する必要があります。

#!/bin/bash

while IFS='|' read -a fields; do 
  IFS=',' read -a vals <<<"${fields[ -1]}"
  unset 'fields[ -1]'
  for v in "${vals[@]}"; do
    printf '%s|' "${fields[@]}" 
    printf '%s\n' "$v"
  done 
done < data

おすすめ記事