簡體   English   中英

用多列在bash問題中排序

[英]sort in bash problem with multiple columns

我需要對一個名為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

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

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. 從出現日期算起,添加到每行開始的秒數
  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上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM