Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用最后一个字段对文本文件排序_Linux_Shell_Sorting_Unix - Fatal编程技术网

Linux 使用最后一个字段对文本文件排序

Linux 使用最后一个字段对文本文件排序,linux,shell,sorting,unix,Linux,Shell,Sorting,Unix,我的文本文件如下所示: 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_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.728p)。所以我想先按最后一个字符排序,然后按数字排序。因此,输出应如下所示:

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
关于如何实现这一产出有何建议

<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-
将输出:

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
  • 旁注:理论上,我认为以下几点应该有效:


如果数据的格式如下所示,特别是只有一个等号(
=
),那么很容易做到:

sort -t= -r -n -k2,2 datafile |\
rev | sort -s -r -k1.1,1.1 | rev
  • 第一个排序在
    =
    上拆分,然后按数字排序
  • 然后我们反转线条,以便很容易找到最后一个字符
  • 然后我们对单个字符进行稳定排序(稳定意味着排序只在需要时更改行顺序(因此前一个排序不会丢失)
  • 最后撤消反转
首先,通过delimeter“c=”获得使用awk排序所需的列

将最后一个字符替换为开始进行排序

按第一个字符排序,而不是按其他字符排序;(根据需要反向排序)


通过排序列将输入文件中的行提取到结果文件。

所有数字的字符数是否相同?例如
1.34133
23.7678
都有7个字符。然后您可以使用定义智能密钥定义。否则,使用
sed
对输入进行预处理,并提取数字和字符以分隔t字段,
排序
文件并删除您使用
剪切
提取的字段。不,所有数字的字符数都不相同。其中一些数字也有5、6和8。您能举一个如何使用sed提取的示例吗?例如反引用数字(即
[0-9\.]
数字和一个点)然后输入字母并用空格分隔:
sed的/=\([0-9\.]*\)\([a-z]\)$/&\1\2/
<file sed 's/^.* c=\([0-9\.]*\)\(.\)$/\2 \1 &/' |
sort -s -k1.1r -k2.2g
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
sort -t= -r -n -k2,2 datafile |\
rev | sort -s -r -k1.1,1.1 | rev
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