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

edi*_*ith 11 text-processing sort files

我想对文件进行排序:

   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 -- 
Run Code Online (Sandbox Code Playgroud)

得到这个

   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 -- 
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 19

sort -k 1.2bn < file
Run Code Online (Sandbox Code Playgroud)

st字段的nd字符开始,忽略前导lanks(并在行尾结束,但这对于仅考虑十进制数字的初始序列的数字排序n无关紧要)在key上进行数字排序。21b

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

    F91HE*-K92HA      7.242      3.910   4.88e+04 --
  F91HE*-F91HZ      7.237      7.122   7.85e+05 --
Run Code Online (Sandbox Code Playgroud)

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

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

对于不管语言环境如何都会忽略前导空格的最后一种排序,您可以执行以下操作:

sort -k 1.2bn -k 1b < file
Run Code Online (Sandbox Code Playgroud)

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