이 출력을 정렬하는 방법 1,10,11..2

이 출력을 정렬하는 방법 1,10,11..2

때로는 데이터베이스에 더 많은 디스크를 추가해야 합니다. 이를 위해서는 이미 존재하는 디스크를 확인하기 위해 디스크를 나열해야 합니다.

문제는 출력이 항상 1,10,11,12...2,20,21...3 등으로 정렬된다는 것입니다.

원하는 방식으로 출력을 정렬하려면 어떻게 해야 합니까? Simple은 sort작동하지 않습니다 sort -t.. -k.. -n.

정렬해야 할 항목의 예:

[root@server1 ~]# oracleasm listdisks
DATA1
DATA10
DATA11
DATA12
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
FRA1
FRA10
FRA11
FRA2
FRA3
..
OCR1
OCR2
OCR3
....

출력을 보는 방법은 다음과 같습니다.

DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
..
..
FRA10
FRA11
..
OCR1
OCR2
OCR3
....

답변1

가장 좋은 방법은 GNU로 파이프 sort하고 sortGNU --version-sort옵션을 활성화하는 것입니다.

그래서 그건oracleasm listdisks | sort --version-sort

정보 페이지에서

--version-sort’
     Sort by version name and number.  It behaves like a standard sort,
     except that each sequence of decimal digits is treated numerically
     as an index/version number.  (*Note Details about version sort::.)

귀하의 의견을 바탕으로 나에게 제공됩니다.

DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3

답변2

사용할 수 없는 경우 sort --version-sort2개의 필드로 분할합니다. 필드 1 = 숫자가 아닌 선행, 필드 2 = 정수, 필드 사이에 Tab 키를 사용하여 필드를 인쇄합니다. 그런 다음 탭으로 구분된 2개의 필드를 사용 sort하고 탭을 제거하세요. I/O 오버헤드를 방지하려면 파이프를 통해 연결하세요. 다음은 OP의 최소한의 데이터와 몇 가지 추가 레코드가 포함된 예입니다.

echo 1 10 2 11 DATA DATA1 DATA10 DATA11 DATA2 FRA FRA1 FRA10 FRA11 FRA2 | \
    xargs -n1 | \
    perl -lne 'print join "\t", /(\D*)(\d*)/' | \
    sort -k1,1 -k2,2n | \
    perl -pe 's/\t//'

인쇄:

1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11

세부 사항:

Perl 단일 라이너는 다음과 같은 명령줄 플래그를 사용합니다. :
-e: Perl에게 파일이 아닌 인라인 코드를 찾도록 지시합니다.
-n: 한 번에 한 줄씩 입력을 반복하며 $_기본적으로 할당됩니다. : 코드 인라인을 실행하기 전에 입력 줄 구분 기호(*NIX의 기본값)를 제거
-l하고 인쇄할 때 추가합니다. : 와 동일하지만 각 루프의 끝에 있는 줄도 있습니다(명시적 항목 제거)."\n"
-p-nprintprint

첫 번째 줄에서는 임의의 숫자(0-9) 이고 숫자가 아닌 임의의 숫자 \d입니다 . \D이러한 패턴은 각각 0회 이상 반복됩니다(사용됨 *). 두 패턴은 괄호를 사용하여 캡처되고 LISTTAB에 연결되어 인쇄되는 두 필드 중 하나로 반환됩니다.

두 번째 Perl 단일 라이너는 단순히 첫 번째 TAB 조회(빈 문자열)를 제거하고 해당 행을 인쇄합니다.

2개 필드 의 경우 sort다음 옵션을 사용하십시오. -k1,1: ASCII 모드에서 필드 1을 정렬합니다. 그런 다음:
-k2,2n: 필드 1이 동일한 경우 필드 2를 기준으로 숫자로 정렬합니다( -n옵션). 행의 나머지 부분이 정렬되지 않도록 하고 이 열 번호로만 정렬을 제한하기 위해
필드 번호가 두 번 반복됩니다(예: ).1,1

관련 정보