用多列在bash问题中排序

时间:2018-09-27 09:57:10

标签: bash sorting

我需要对一个名为lokdata的文件进行排序

 (1) (260, 02) 0x2c435 0x2c43501 Thu Sep 27 09:43:21 2018
 (1) (60, 02) 0x2c435 0x2c43503 Thu Sep 27 09:46:14 2018
 (1) (260, 02) 0x2c435 0x2c43503 Thu Sep 27 09:46:44 2018
 (1) (260, 03) 0x4461e 0x4461e1f Thu Sep 27 10:31:05 2018

我需要对最新日期进行排序,以便可以使用head。 我的尝试失败示例

    sort -k10,10r -r -k7,7M -k 8,8 -k9,9r lokdata


 (1) (260, 02) 0x2c435 0x2c43501 Thu Sep 27 09:43:21 2018
 (1) (260, 02) 0x2c435 0x2c43503 Thu Mar 01 09:46:14 2018
 (1) (260, 02) 0x2c435 0x2c43503 Thu Mar 03 09:46:44 2018
 (1) (260, 02) 0x2c435 0x2c43501 Thu Mar 29 09:43:21 2018
 (1) (260, 03) 0x4461e 0x4461e1f Thu Sep 27 10:31:05 2026

2 个答案:

答案 0 :(得分:0)

好的,我不得不稍作搜索,但这是解决方案:

sort -k10nr,10 -k7Mr,7 -k8nr,8 -k9r,9

输出

 (1) (260, 03) 0x4461e 0x4461e1f Thu Sep 27 10:31:05 2026
 (1) (260, 02) 0x2c435 0x2c43501 Thu Sep 27 09:43:21 2018
 (1) (260, 02) 0x2c435 0x2c43501 Thu Mar 29 09:43:21 2018
 (1) (260, 02) 0x2c435 0x2c43503 Thu Mar 03 09:46:44 2018
 (1) (260, 02) 0x2c435 0x2c43503 Thu Mar 01 09:46:14 2018

它如何工作?

  1. -k10nr,10:在代表年份的第10个字段上进行反向数字排序
  2. -k7Mr,7:第二种是月份排序,它使用标准的3个字符的月份表示法进行排序,再次相反。
  3. k8nr,8:第三种排序是在当月的某天,再次将数字反转。
  4. -k9r,9:最后将9个字段排序为代表时间的字符串,而且时间明显不同。

为什么这么复杂?从定义一个修饰符的那一刻起,在密钥规范中,全局标记-r-n或任何不再适用的标记。因此,不可能将全局标志与局部键修饰符混合使用。

答案 1 :(得分:0)

  1. 将每行添加到自该日期起的纪元秒数
  2. 从纪元开始按秒排序
  3. 删除自纪元以来的秒数

cat lokdata |
xargs -d'\n' -l1 -- sh -c 'echo "$(date --date="$(<<<"$1" cut -d " " -f7-)" +%s)" "$1"' -- | 
sort -r -n -k1 | 
cut -d ' ' -f2-

要避免CPU过热,请将cat lokdata |更改为< lokdata

tutorialspoint上的生活示例。