テキストファイルを変換しようとしていますが、好きなように整理するのは少し難しいようです。
ファイルは以下のようになります。
(0,{35=9000.0, 36=9000.0, 33=9000.0, 34=9000.0})
次のように再構成したい
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
私はShellに初めて触れたので、問題を解決するにはあなたの助けが必要です。項目をの値でソートしたいと思います{}
。
答え1
Perlの解決策は次のとおりです。
cat b.txt
(0,1,{35=9000.0, 36=9000.0, 33=9000.0, 34=9000.0})
perl -lne '$_=~/^\(([\d\,\.]+)\s*\{(.*)\}\)$/; @first=split /[,\s]/, $1; @second=split /,\s/, $2; map{($k, $v) = split "=", $_; $h{$k}=$v} @second; foreach $k (sort keys(%h)) { print join(" ", @first), " $k ",$h{$k}; }' b.txt
0 1 33 9000.0
0 1 34 9000.0
0 1 35 9000.0
0 1 36 9000.0
(もちろん、このPerlプログラムは1行以上を使用し、変数に意味のある名前を付ける方法を知っていれば読みやすくなります)
答え2
牛に似た一種の栄養アッ解決策:
awk -F'[,=]' '{ gsub(/[({}) ]/,"",$0); for(i=2;i<NF;i+=2) a[$i]=$(i+1);
asorti(a,b); for(k in a) print $1,k,a[k] }' file
-F'[,=]'
- フィールド区切り記号gsub(/[({}) ]/,"",$0)
- 不要な文字を削除for(i=2;i<NF;i+=2) a[$i]=$(i+1)
- 値のペアを配列として収集a
asorti(a,b)
-a
キーに基づいて配列を並べ替える
出力:
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
答え3
- 各入力行の
$n
<=先行カンマの前の10進値。 %h
そのキーは=
左の数字と右の値のハッシュです。- 次に、キーを数字でソートし
$n
、キー、correspを印刷します。値。 $,
=OFS
<=$"
= 出力リストの区切り文字、デフォルトは空白です。
perl -lne '$,=$";
($n, %h) = ( /^\((\d+),/, /(\d+)=([^,}]+)/g );
print $n, $_, $h{$_} for sort { $a <=> $b } keys %h;
' yourfile
結果:
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0