試圖對檔案中的行進行排序。column1 是 HH:MM:SS 格式,col2 是 AM/PM。需要先安排上午到下午的線路,然后再安排時間。
當前的 :
11:36:48 AM col3 ...
11:32:00 AM col3 ...
03:18:54 PM col3 ...
02:26:40 PM col3 ...
01:51:56 PM col3 ...
12:55:58 PM col3 ...
11:58:48 AM col3 ...
09:38:41 AM col3 ...
最后:
09:38:41 AM col3 ...
11:32:00 AM col3 ...
11:36:48 AM col3 ...
11:58:48 AM col3 ...
12:55:58 PM col3 ...
01:51:56 PM col3 ...
02:26:40 PM col3 ...
03:18:54 PM col3 ...
謝謝
uj5u.com熱心網友回復:
您所要做的就是使用 獲取 AM 行grep,然后sort在輸出上使用。這樣做之后,您可以對 PM 線執行相同的操作。
cp "my_file" "backup_file" #Backup old file before overwriting
grep '^[0-9:]* AM' "backup_file" | sort > "my_file"
grep '^[0-9:]* PM' "backup_file" | sort >> "my_file"
在使用操作之前備份您的檔案很重要,>因為這將完全覆寫您的檔案。
uj5u.com熱心網友回復:
施瓦茲變換:
while read -ra fields; do
printf '%s\t%s\n' "$(date -d "${fields[*]:0:2}" ' %s')" "${fields[*]}"
done < input \
| sort -n \
| cut -f 2-
產出
09:38:41 AM col3 ...
11:32:00 AM col3 ...
11:36:48 AM col3 ...
11:58:48 AM col3 ...
12:55:58 PM col3 ...
01:51:56 PM col3 ...
02:26:40 PM col3 ...
03:18:54 PM col3 ...
while 回圈計算每個時間戳的紀元時間并將其添加到輸出流中。然后它按數字時間排序。然后洗掉該欄位。
在 bash 中執行此操作可能比在 perl 中執行要慢:
perl -MTime::Piece -lane '
push @lines, [@F];
} END {
print join "\n",
map {"@{$_->[1]}"}
sort {$a->[0] <=> $b->[0]}
map {[Time::Piece->strptime("$_->[0] $_->[1]", "%T %p")->epoch, $_]}
@lines;
' input
uj5u.com熱心網友回復:
如果所有時間都來自同一天,那么您可以生成一個等效的 24 小時awk并將其添加到該行。這樣,sort就可以正常作業了,您只需要從以下行中洗掉 24H 時間sed:
awk -F '[ :]' '
{
H24 = ($1 == 12 ? ($4 == "AM" ? 0 : $1) : ($4 == "PM" ? $1 12 : $1))
printf "ddd%s%s%s", H24, $2, $3, OFS, $0, ORS
}
' data.txt |
sort |
sed 's/[^ ]* //'
uj5u.com熱心網友回復:
如評論中所述,對當前時間列進行排序會出現問題,因為12:xx條目需要排在01:xx條目之前。
一種方法:
- 將
12:xx條目轉換為00:xx - 運行正常的 2 列排序
- 將
00:xx條目轉換回12:xx
一個sed | sort | sed想法:
$ sed 's/^12/00/' sample.log | sort -k2,2 -k1,1 | sed 's/^00/12/'
09:38:41 AM col3 ...
11:32:00 AM col3 ...
11:36:48 AM col3 ...
11:58:48 AM col3 ...
12:55:58 PM col3 ...
01:51:56 PM col3 ...
02:26:40 PM col3 ...
03:18:54 PM col3 ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/535646.html
標籤:狂欢排序时间戳
