시퀀스 재설정 시 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)에 있으며 동일한 정렬 기준이 해당 항목에도 적용됩니다(이것이 바로 귀하가 얻게 될 것입니다 996) 995.

따라서 이 특정 사례를 처리하기 위해 우리는 some 을 사용합니다 awk. 이 코드는 세 자리 일련 번호를 올바른 카운트 값으로 다시 확장하고 해당 값을 기준으로 정렬한 다음 다시 제거합니다.

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개 이상의 인스턴스를 생성하려면 세 자리 일련번호만 사용해서는 안 됩니다.

관련 정보