日付列(サンプルデータの最後の列)を考慮してファイル内のデータをソートしたいと思います。いくつかのコマンドを試しましたが、成功しませんでした。
サンプル:
Beendet|48149|1550804401|STR|Fri Feb 22 4:00:45 2019
Beendet|940001|1550790961|CBST|Fri Feb 22 0:16:12 2019
Beendet|658521|1550817001|CANS|Fri Feb 22 7:30:10 2019
Beendet|48150|1550775601|EXP|Thu Feb 21 20:00:12 2019
Beendet|7|1550779201|MAS|Thu Feb 21 21:00:23 2019
Beendet|9072|1550777401|AMS0|Thu Feb 21 20:52:17 2019
Beendet|9220|1550804401|AMS1|Fri Feb 22 4:00:09 2019
Beendet|670|1550811601|MOR|Fri Feb 22 6:00:07 2019
Beendet|73|1550790061|HIST|Fri Feb 22 2:00:30 2019
Beendet|122|1550804821|HIST1|Fri Feb 22 4:07:08 2019
私の試みは次のとおりです。
sort -r -k5.12 -k5.9 completefile.txt (sorting using the date and time field lengths)
sort -n -k5,5 completefile.txt
sort -k5n,5 completefile.txt
すべて同じ結果を提供します。
答え1
awkスクリプト:最後のフィールドをタイムスタンプに変換して比較します。
#!/usr/bin/awk -f
BEGIN {
FS = "|"
}
{
data[NR] = $0
cmd = "date \"+%s\" --date " "\"" $5 "\""
cmd|getline
stamp2idx[$0] = NR
}
END {
asorti(stamp2idx, sorted)
for (n in sorted) {
print data[stamp2idx[sorted[n]]]
}
}
出力
➤ ./solution.awk data 20:39:09
Beendet|48150|1550775601|EXP|Thu Feb 21 20:00:12 2019
Beendet|9072|1550777401|AMS0|Thu Feb 21 20:52:17 2019
Beendet|7|1550779201|MAS|Thu Feb 21 21:00:23 2019
Beendet|940001|1550790961|CBST|Fri Feb 22 0:16:12 2019
Beendet|73|1550790061|HIST|Fri Feb 22 2:00:30 2019
Beendet|9220|1550804401|AMS1|Fri Feb 22 4:00:09 2019
Beendet|48149|1550804401|STR|Fri Feb 22 4:00:45 2019
Beendet|122|1550804821|HIST1|Fri Feb 22 4:07:08 2019
Beendet|670|1550811601|MOR|Fri Feb 22 6:00:07 2019
Beendet|658521|1550817001|CANS|Fri Feb 22 7:30:10 2019
答え2
予想される順序を取得するために正しく理解した場合は、各フィールドにソート基準を指定する必要があります。
sort -k5n -k2M -k3n -k4V file.txt
どこ
-k5n
5列(年)は数字順です。-k2M
2列は「月」に基づいてソートされます。-k3n
3列(日)は数字順です。-k4V
4列(時間)は「バージョン」の順番です。
ログプロセスを変更できる場合date -Is
(2019-02-22T12:20:28+00:00)、使用を検討してソートを使用してください。
sort -t '|' -k5 file.txt
答え3
コマンドを簡素化し、期待した結果を得ました。
sort -t '|' -r -k5.8,5.18 -n -k3 completefile.txt
- 5番目の列に長さ別のソートを適用し、
- 3列目の数値順に並べ替えます。