次のデータを含むファイルがあります。
1,2,3 4,5,6 7,8,9 12,22,0
私は4つの列を持つテーブルを作成したいと思いますa,b,c,d
。この列にはa
最初の列の値があり、b
2番目の列にはその値があります。
上記の例では、列は次のようになります。
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番目)を削除してから、変更された文字列をバッファ()に戻します。これは文字列状態にある場合でも継続されます。消えたら、残りを印刷します。ta
g
s
p
s
h
,
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