如何根据字段的一部分对文件进行排序

如何根据字段的一部分对文件进行排序

我想对文件进行排序:

   D104HN-D104HA      8.320      4.521   1.69e+05 -- 
   D104HN-D104HB*      8.320      2.823   2.93e+05 -- 
   A90HB#-A90HA      1.655      4.207   7.12e+05 -- 
   A90HB#-F91HA      1.653      4.411   8.59e+04 -- 
   A114HB#-A114HA      1.253      4.098   7.67e+05 -- 
   A114HB#-R111HA      1.251      3.929   1.76e+05 -- 
   A114HB#-W110HA      1.253      4.451   3.68e+04 -- 
   F91HE*-F91HZ      7.237      7.122   7.85e+05 -- 
     F91HE*-K92HA      7.242      3.910   4.88e+04 -- 

并得到这个

   A90HB#-A90HA      1.655      4.207   7.12e+05 -- 
   A90HB#-F91HA      1.653      4.411   8.59e+04 -- 
   F91HE*-F91HZ      7.237      7.122   7.85e+05 -- 
   F91HE*-K92HA      7.242      3.910   4.88e+04 -- 
   D104HN-D104HA      8.320      4.521   1.69e+05 -- 
   D104HN-D104HB*      8.320      2.823   2.93e+05 -- 
   A114HB#-A114HA      1.253      4.098   7.67e+05 -- 
   A114HB#-R111HA      1.251      3.929   1.76e+05 -- 
   A114HB#-W110HA      1.253      4.451   3.68e+04 -- 

也就是说,对该行上第一个非空白序列的第二个及后续字符进行数字排序。

答案1

sort -k 1.2bn < file

n以数字方式对ey进行排序,从st字段的第 ndk字符开始,忽略前导空格(并在行尾结束,但这对于仅考虑十进制数字的初始序列的数字排序并不重要)。21b

请注意,如果存在平局,例如这两行之间:

    F91HE*-K92HA      7.242      3.910   4.88e+04 --
  F91HE*-F91HZ      7.237      7.122   7.85e+05 --

然后,顺序将基于将两行完全作为字符串进行比较的最后手段排序。

对于某些语言环境,在比较字符串时,首先会忽略空格,在这种情况下,F91 会出现在 K92 之前(如F之前的排序K)。对于其他语言环境(如 C 语言环境中的情况),空格不会被忽略,并且 K92 将出现在 F91 之前(空格在 之前排序F)。

对于无论语言环境如何都会忽略前导空格的最后手段排序,您可以这样做:

sort -k 1.2bn -k 1b < file

1b函数会在以第一个字段开头的行部分上按词法排序(根据第一个键上的关系),忽略前导空格。

相关内容