
私のフォルダには次のファイルのリストがあります。各ファイル名にはyyyymmdd_hhmm
日付と時刻()が含まれています。最後の3文字は最大シーケンスの後にリセットされるシーケンス番号で、999
シーケンスが再開されます001
。
node55_20200420_1755_995
node55_20200420_1756_998
node55_20200420_1755_996
node55_20200420_1757_999
node55_20200420_1756_997
node55_20200420_1757_001
node55_20200420_1758_002
node55_20200420_1758_003
コマンドを使用する場合
ls node* | sort
私は次のような結果を得ます。私は001
後の順序がほしい999
。このコマンドは、シーケンスリセットが発生しない限り正常に動作します。これを処理する方法を知っていますか?
実際の出力
node55_20200420_1755_995
node55_20200420_1755_996
node55_20200420_1756_997
node55_20200420_1756_998
node55_20200420_1757_001
node55_20200420_1757_999
node55_20200420_1758_002
node55_20200420_1758_003
希望の出力
node55_20200420_1755_995
node55_20200420_1755_996
node55_20200420_1756_997
node55_20200420_1756_998
node55_20200420_1757_999
node55_20200420_1757_001
node55_20200420_1758_002
node55_20200420_1758_003
答え1
一部の出力をある方向に並べ替えたり、例外を別の方向に簡単に整列したりすることはできません。
999
指定された分以内にシーケンスとシーケンスのみがある場合は、000
ファイル名をフィールドに分割し、最終フィールド(シーケンスカウンタ)を降順に並べ替えることができます。しかし、あなたの例に示されているように、これはうまくいかず、995
それも996
同じmin(20200420_1755
)にあり、同じ並べ替え基準がその項目にも適用されます(これはすぐにあなたが得るでしょう996
)995
。
したがって、この特定のケースを処理するために私たちはsomeを使いますawk
。このコードは、3桁のシリアル番号を正しいカウント値に戻し、その値に基づいてソートしてから再度削除します。
ls node* |
sort | # First pass attempt
awk -F_ '
BEGIN { OFS = FS } # Delimiter always "_"
(oseq % 1000) == 999 { thousands++ } # After previous 999 add 1000
{ seq = $NF + (thousands * 1000) } # Convert sequence into value
seq < oseq && (seq % 1000) < 500 { seq += 1000 } # Special case
{ $5 = seq; oseq = seq; print } # Append counter, output result
' |
sort -t_ -n -k5,6 | # Sort by counter
cut -d_ -f1-4 # Strip it off
例データセットを使用した結果
node55_20200420_1755_995
node55_20200420_1755_996
node55_20200420_1756_997
node55_20200420_1756_998
node55_20200420_1757_999
node55_20200420_1757_001
node55_20200420_1758_002
node55_20200420_1758_003
このコードは完璧ではありません。実際には、1分に100を超えるインスタンスを作成する場合は、3桁のシリアル番号を使用しないでください。