我正在尝试转换文本文件,但按照我的意愿组织它似乎有点困难。
该文件如下所示。
(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 程序将更容易阅读)
答案2
GNUawk解决方案:
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
<= 前导逗号之前的十进制值。 %h
其键为左侧的数字=
和右侧的值的哈希。- 然后对键进行数字排序并打印
$n
, key, 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