Sort

如何按持續時間列對文件進行排序?

  • April 24, 2022

如何對包含以下內容的文件進行排序?(s=秒,h=小時,d=天 m=分鐘)

1s
2s
1h
2h
1m
2m
2s
1d
1m
awk '{ unitvalue=$1; }; 
   /s/ { m=1 }; /m/ { m=60 }; /h/ { m=3600 }; /d/ { m=86400 }; 
   { sub("[smhd]","",unitvalue); unitvalue=unitvalue*m; 
   print unitvalue " " $1; }' input |
       sort -n | awk '{ print $2 }'
1s
2s
2s
1m
1m
2m
1h
2h
1d

第一個版本 - 使用 FPAT

gawk '
BEGIN {
   FPAT="[0-9]+|[smhd]";
}
/s/ { factor = 1 }
/m/ { factor = 60 }
/h/ { factor = 3600 }
/d/ { factor = 86400 }
{
   print $1 * factor, $0;
}' input.txt | sort -n | awk '{print $2}'

FPAT - 描述記錄中欄位內容的正則表達式。設置後,gawk 將輸入解析為欄位,其中欄位匹配正則表達式,而不是使用FS變數的值作為欄位分隔符。

第二版

我驚訝地發現,沒有FPAT它也可以。awk是由- How awk Converts Between Strings and Numbers的數字轉換機制引起的,即:

通過將字元串的任何數字前綴解釋為數字,將字元串轉換為數字:“2.5”轉換為 2.5,“1e3”轉換為 1,000,“25fix”的數值為 25。無法解釋的字元串因為有效數字轉換為零。

gawk '
/s/ { factor = 1 }
/m/ { factor = 60 }
/h/ { factor = 3600 }
/d/ { factor = 86400 }
{
   print $0 * factor, $0;
}' input.txt | sort -n | awk '{print $2}'

輸入(改變了一點)

1s
122s
1h
2h
1m
2m
2s
1d
1m

輸出

注: 122 秒超過 2 分鐘,所以排在 2m 之後。

1s
2s
1m
1m
2m
122s
1h
2h
1d

引用自:https://unix.stackexchange.com/questions/398212