Sort
如何按持續時間列對文件進行排序?
如何對包含以下內容的文件進行排序?(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