ピボットファイルの値

ピボットファイルの値

最初の列がキーであるファイルがあります。行には最大2800の区切り文字を含めることができます。データを行から列に変換する必要があります。以下は、サンプル入力と希望の出力です。

ソースファイル

123,A,B,,,,AC,DF,,,,,,,,,,,,n 
567,A,B,,C,D,,,,,,,,, 7
89,C,B

出力

123,A
123,B
123,
123,
.
.
123,AC
123,DF
567,A
567,B
567,C
567,D
567,7
89,C
89,B

アドバイスしてください。

答え1

ミラーの使用(http://johnkerl.org/miller/doc/)と

mlr --nidx --fs "," reshape -r '[^1]' -o item,value \
then filter -S -x '$value==""' \
then cut -f 1,value input.txt

あなたは

123,A
123,B
123,AC
123,DF
123,n
567,A
567,B
567,C
567,D
567, 7
89,C
89,B

null値も必要な場合は、次のようになります。

mlr --nidx --fs "," reshape -r '[^1]' -o item,value \
then cut -f 1,value input.txt

あなたはやる

123,A
123,B
123,
123,
123,
123,AC
123,DF
123,
123,
123,
123,
123,
123,
123,
123,
123,
123,
123,n
567,A
567,B
567,
567,C
567,D
567,
567,
567,
567,
567,
567,
567,
567, 7
89,C
89,B

答え2

$ cat file
123,A,B,,,,AC,DF,,,,,,,,,,,,n
567,A,B,,C,D,,,,,,,,, 7
89,C,B
$ awk -F, 'BEGIN { OFS = FS } { for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
123,A
123,B
123,AC
123,DF
123,n
567,A
567,B
567,C
567,D
567, 7
89,C
89,B

これは、データが次の場所にあると仮定します。シンプル引用符が不要なCSV形式です(すべてのフィールドにコンマや改行は含まれていません)。コードawkは、単にフィールド2で始まる各行のカンマ区切りフィールドを繰り返し、新しい行の最初のフィールドと一緒に印刷します。空のフィールドは無視されます。空のフィールドを無視したくない場合は(質問では明確ではありません)、コードif ($i != "")からそのビットを削除してください。

関連情報