结果:

结果:

我正在尝试转换文本文件,但按照我的意愿组织它似乎有点困难。

该文件如下所示。

(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

  1. 对于每一行输入,$n<= 前导逗号之前的十进制值。
  2. %h其键为左侧的数字=和右侧的值的哈希。
  3. 然后对键进行数字排序并打印$n, key, corresp。价值。
  4. $,= 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

相关内容