내 폴더에 다음 파일 목록이 있습니다. 각 파일 이름에는 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개 이상의 인스턴스를 생성하려면 세 자리 일련번호만 사용해서는 안 됩니다.