我有如下所示的文本文件:
cc_1 ( AB GND ) capacitor c=1.72728p
cc_2 ( AB VIN ) capacitor c=26.9013p
cc_3 ( AB H_SNS ) capacitor c=15.2554p
cc_4 ( AB L_SNS ) capacitor c=2.89517p
cc_5 ( AB VREG ) capacitor c=23.7678f
cc_6 ( AB VIN ) capacitor c=1.34133f
我想按最后一列对该文件排序。最后一列是数字和字符的组合(例如1.72728p)。所以我想先按最后一个字符排序,再按数字排序。因此输出应如下所示:
cc_2 ( AB VIN ) capacitor c=26.9013p
cc_3 ( AB H_SNS ) capacitor c=15.2554p
cc_4 ( AB L_SNS ) capacitor c=2.89517p
cc_1 ( AB GND ) capacitor c=1.72728p
cc_5 ( AB VREG ) capacitor c=23.7678f
cc_6 ( AB VIN ) capacitor c=1.34133f
关于如何实现此输出的任何建议?
答案 0 :(得分:0)
<input_file sed 's/^.* c=\([0-9\.]*\)\(.\)$/\2 \1 &/' |
xargs printf "%s %030.10f %s %s %s %s %s %s %s\n" |
sort -k1.1r -k2.2n |
cut -d' ' -f3-
<letter> <float numbe> <rest of the line
--generic-sort
和sort
的麻烦*。 --generic-sort
还是gnu排序扩展。xargs
与printf
一起使用。如果30.10
对您来说不够精确,则可以随时提高精度(例如100.50
)。<letter>
列进行反向排序,然后使用数字进行数字排序。经过测试:
cat <<EOF >file
cc_1 ( AB GND ) capacitor c=1.72728p
cc_2 ( AB VIN ) capacitor c=26.9013p
cc_3 ( AB H_SNS ) capacitor c=15.2554p
cc_4 ( AB L_SNS ) capacitor c=2.89517p
cc_5 ( AB VREG ) capacitor c=23.7678f
cc_6 ( AB VIN ) capacitor c=1.34133f
cc_6 ( AB VIN ) capacitor c=1.44133f
cc_6 ( AB VIN ) capacitor c=1.24133f
cc_6 ( AB VIN ) capacitor c=12.24133f
cc_6 ( AB VIN ) capacitor c=11.24133f
cc_6 ( AB VIN ) capacitor c=13.24133f
cc_6 ( AB VIN ) capacitor c=13.24133001f
cc_6 ( AB VIN ) capacitor c=13.24133003f
cc_6 ( AB VIN ) capacitor c=13.24133002f
EOF
<file sed 's/^.* c=\([0-9\.]*\)\(.\)$/\2 \1 &/' |
xargs printf "%s %030.10f %s %s %s %s %s %s %s\n" |
sort -k1.1r -k2.2n |
cut -d' ' -f3-
将输出:
cc_2 ( AB VIN ) capacitor c=26.9013p
cc_3 ( AB H_SNS ) capacitor c=15.2554p
cc_4 ( AB L_SNS ) capacitor c=2.89517p
cc_1 ( AB GND ) capacitor c=1.72728p
cc_5 ( AB VREG ) capacitor c=23.7678f
cc_6 ( AB VIN ) capacitor c=13.24133003f
cc_6 ( AB VIN ) capacitor c=13.24133002f
cc_6 ( AB VIN ) capacitor c=13.24133001f
cc_6 ( AB VIN ) capacitor c=13.24133f
cc_6 ( AB VIN ) capacitor c=12.24133f
cc_6 ( AB VIN ) capacitor c=11.24133f
cc_6 ( AB VIN ) capacitor c=1.44133f
cc_6 ( AB VIN ) capacitor c=1.34133f
cc_6 ( AB VIN ) capacitor c=1.24133f
<file sed 's/^.* c=\([0-9\.]*\)\(.\)$/\2 \1 &/' |
sort -s -k1.1r -k2.2g
但是它不能也不正确地对15
和1
和2
进行排序(对数字进行排序,而不是浮点数,因此点.
使所有内容无效(显示head -n4
,请注意2.8
比15.2
大):
p 26.9013 cc_2 ( AB VIN ) capacitor c=26.9013p
p 2.89517 cc_4 ( AB L_SNS ) capacitor c=2.89517p
p 15.2554 cc_3 ( AB H_SNS ) capacitor c=15.2554p
p 1.72728 cc_1 ( AB GND ) capacitor c=1.72728p
答案 1 :(得分:0)
如果数据具有所示格式,特别是只有一个等号(=
),则这样做很容易:
sort -t= -r -n -k2,2 datafile |\
rev | sort -s -r -k1.1,1.1 | rev
=
处分割,然后按数字排序答案 2 :(得分:0)
cat input.txt | awk -F"c=" '{print $NF}' |
while read line ; do echo ${line: -1:1}${line:0:-1} ; done |
sort -k1.1,1.1 -r -k1.2,1.3nr |
while read line ; do grep ${line:1}${line:0:1} input.txt;
done > result.txt
首先得到用定界符“ c =”;
用awk排序所需的列。将最后一个字符替换为开头;
按首字符排序,而不是按其他字符排序; (根据需要进行反向排序);
按排序的列从输入文件到结果文件的行提取。