gpt4 book ai didi

linux - 使用最后一个字段对文本文件进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 05:09:39 25 4
gpt4 key购买 nike

我有如下所示的文本文件:

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

关于如何实现此输出有什么建议吗?

最佳答案

<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-
  • 首先输入通过 sed。我提取了 float 及其后面的字母。输出变为 <letter> <float numbe> <rest of the line
  • 然后我遇到了麻烦* --generic-sortsort--generic-sort无论如何都是一个 gnu 排序扩展。
  • 因此,我决定格式化 float ,使其至少有 20 个前导零,逗号后面至少有 10 个数字。我用简单的xargsprintf 。如果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 进行排序和12 (对数字排序,而不是 float 排序,因此点 . 使所有内容无效(显示 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

关于linux - 使用最后一个字段对文本文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57040446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com