シーケンスリセット時のUnixソート

シーケンスリセット時のUnixソート

私のフォルダには次のファイルのリストがあります。各ファイル名には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)にあり、同じ並べ替え基準がその項目にも適用されます(これはすぐにあなたが得るでしょう996995

したがって、この特定のケースを処理するために私たちは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桁のシリアル番号を使用しないでください。

おすすめ記事