列を列ごとに複数の値を持つ行に変換するには?

列を列ごとに複数の値を持つ行に変換するには?

次のデータを含むファイルがあります。

1,2,3 4,5,6 7,8,9 12,22,0

私は4つの列を持つテーブルを作成したいと思いますa,b,c,d。この列にはa最初の列の値があり、b2番目の列にはその値があります。

上記の例では、列は次のようになります。

a   b   c   d
1   4   7   12
2   5   8   22
3   6   9   0

残った何でも。特定の行の列の項目は同じです。ただし、これらの項目は行ごとに異なる場合があります。たとえば、一部の行には列ごとにコンマで区切られた項目が1つしかない場合があり、一部の行には10行がある場合があります。

答え1

列の命名方法(ユーザー入力、使用する各列に事前定義された名前など)は不明です。

文字列を列に分割するには、次のものを使用できますsed

echo 1,2,3 4,5,6 7,8,9 12,22,0 | sed -n 'h;:a;g;s/,[^ ]*//gp;g;s/^[^, ]*,//;s/ [^,]*,/ /g;h;ta;p'

ここではsed、文字列全体をバッファにコピーし()、hループの行を繰り返し(:a..)、バッファからコピーした文字列を取得し()、各部分から最初の数字を取得し(first)印刷します()。変更されていない文字列を再検索し、最初の数字(2番目と3番目)を削除してから、変更された文字列をバッファ()に戻します。これは文字列状態にある場合でも継続されます。消えたら、残りを印刷します。tagspsh,p

答え2

必要な作業を実行できます。

 $ sed -Ee '
     s/^/ /;y/ /\n/
     :loop
        s/(\n.*)\n([^,]*),/\2 \1 /
     tloop
     s/(.*) \n([^,]*),/\2 \1\n/
     P;/,/D;s/.*\n//
 ' inp

次のアプローチは、各列の前の列要素を選択して、印刷する行の外観を指定することです。

別のアプローチは、カンマ分割に基づいて列を配列に分割することです。次に、サブ配列の要素が不足するまで先行する要素を移動します。行ごとの番号が同じであるためです。

 $ perl -lane '$,=" ";
    my @A = map { [split /,/] } @F;
    print map { shift @$_ } @A while @{$A[0]};
 ' inp 

関連情報