如何根据价值的特定部分对行进行排序?

时间:2018-05-07 10:03:59

标签: bash shell

当我运行以下命令时:

command list -r machine-a-.* | sort -nr

它给了我以下结果:

machine-a-9
machine-a-8
machine-a-72
machine-a-71
machine-a-70

我希望根据最后的数字按降序排列这些行 (显然sort -nr不能按预期工作。)

2 个答案:

答案 0 :(得分:2)

您只需要-t中的-ksort选项。

command list -r machine-a-.* | sort -t '-' -k 3 -nr

-t是用于分隔字段的分隔符 通过赋予'-'的值,sort会将给定的文字视为:

Field 1  Field 2  Field 3    
machine    a        9
machine    a        8
machine    a        72
machine    a        71
machine    a        70

-k指定将用于比较的字段 通过赋予值3sort将通过比较Field 3中的值对行进行排序。 即,将比较这些字符串

9
8
72
71
70

-n使sort将字段视为数字而非字符串进行比较。

-r使sort按相反的顺序(降序)对行进行排序。

因此,通过按相反的顺序从Field 3数字进行排序,这将是输出:

machine-a-72
machine-a-71
machine-a-70
machine-a-9
machine-a-8

答案 1 :(得分:0)

以下是排序输入的示例:

$ cat 1.txt
machine-a-9
machine-a-8
machine-a-72
machine-a-71
machine-a-70

这是我们的简短程序:

$ cat 1.txt | ( IFS=-; while read A B C ; do  echo $C $A-$B-$C; done ) | sort -rn | cut -d' '  -f 2

这是它的输出:

machine-a-72
machine-a-71
machine-a-70
machine-a-9
machine-a-8

说明:

$ cat 1.txt  \        (put contents of file into pipe input)
| (          \        (group some commands)
  IFS=-;              (set field separator to "-" for read command)
  while read A B C ;  (read fields in 3 variables A B and C every line)
     do  echo $C $A-$B-$C;    (create output with $C in the beggining)
  done 
  )          \         (end of group)
| sort -rn   \         (reverse number sorting)
| cut -d' '  -f 2      (cut-off first unneeded anymore field)