여러 문자 길이의 구분 기호를 사용하여 정렬하는 방법은 무엇입니까?

여러 문자 길이의 구분 기호를 사용하여 정렬하는 방법은 무엇입니까?

입력하다:

$ cat a.txt 
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
$ 

산출:

$ cat a.txt | sort SOMEMAGIC
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5
$ 

질문: 여러 문자 길이의 구분 기호가 있는 경우 어떻게 정렬합니까? ("FOO")?

예제에서는 a.txt두 번째 열을 기준으로 정렬합니다 .

문제는 일반적으로 숫자는 a.txt무엇이든 될 수 있다는 것입니다.

답변1

sed예를 들어 문자열을 단일 문자 구분 기호로 바꾸고 열별로 정렬한 다음 다시 구분 기호로 바꾸려면 다음을 사용하세요 .

sed -e s/FOO/X/g a.txt | sort -k 2,2 -t X | sed -e s/X/FOO/g 

이는 입력에 문자가 나타나지 않는다는 것을 알고 있다고 가정합니다. 제어 문자는 일반적인 후보이지만 입력 형식에 대한 지식을 바탕으로 선택해야 합니다.

답변2

이 시도:

$ perl -ane '
    push @h,[$_,(split(/FOO/))[1]];
    END {
        print map  { $_->[0] }
              sort {$a->[1] <=> $b->[1]}
              @h;
    }
' file
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

설명하다

  • 각 배열 ref [line, key]를 array에 저장합니다 @h.[$_,(split(/FOO/))[1]]

  • 파일 읽기가 끝나면:

    • @h키를 기준으로 배열의 배열 참조 정렬sort {$a->[1] <=> $b->[1]}
    • 원래 줄을 추출하여 @h인쇄하십시오.map { $_->[0] }

답변3

필드가 숫자라고 가정하면 GNU sort버전 정렬도움이 될 수도 있습니다. 의 F꼬리가 필드 2로 들어가고 필드 2가 value 를 포함하는 것으로 처리되도록 구분 기호를 로 설정합니다 . 필드 2에 버전 정렬을 지정하면 숫자가 아닌 접두사가 무시되고 출력이 필드 2의 후행 숫자 부분을 기준으로 정렬됩니다.OOFOOsortOO2, OO5 and OO1OO

sort -k2,2V -t 'F' a.txt
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

또는 awk인메모리 솔루션의 오버헤드를 허용할 수 있다면 GNU를 사용하세요.

awk -F'FOO' '{a[$2]=$0};END{asort(a, b, "@ind_num_asc");
for (i in b) print b[i]}' a.txt
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

답변4

sort -k구분선보다는 눈 에 너무 집중하시면 될 것 같아요 . 키의 문자 범위를 지정할 수 있습니다.

info sort

...입력 라인 "foo bar"가 주어지면 sort이를 "foo" 및 "bar" 필드로 분할합니다. 필드 구분 기호는 이전 또는 다음 필드의 일부로 간주되지 않으므로 "sort -t" ""를 사용하면 동일한 입력 줄에 빈 필드 "foo" 및 "bar"라는 세 개의 필드가 있습니다. 그러나 줄 끝까지 확장되거나(예: "-k 2") 범위로 구성된 필드(예: "-k 2,3"), 범위 끝점 사이에 있는 필드 구분 기호를 유지합니다..

Stephane이 언급했듯이 그 반대도 마찬가지입니다. 바이트 범위가 있는 필드 조각만 정렬하거나 여러 키가 있는 동일한 필드의 여러 조각을 정렬할 수도 있습니다. 따라서 귀하의 경우에는 다른 범위에서 동일한 필드를 여러 번 사용할 수 있습니다. 바라보다?

sort -k1.5n -k1.1n --debug <<\DATA
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
DATA
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
sort: key 2 is numeric and spans multiple fields
2FOO1FOO9
    _
_
_________
1FOO2FOO3
    _
_
_________
4FOO5FOO5
    _
_
_________

sort이는 기본 키가 필드 1의 5번째 바이트부터 시작하여 필드 1의 끝까지 확장된 다음 필드 1의 첫 번째 바이트부터 필드 1의 끝까지 정렬되도록 지시합니다 . 위에서 설명했듯이 이 --debug옵션은 정렬을 시도할 때 매우 유용할 수 있습니다. sort그러나 여기에는 디버깅이 없습니다.

sort -k1.5n -k1.1n <<\DATA        
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
DATA

###OUTPUT###
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

각각에 하나의 문자 만 사용하려면 sort범위를 좁혀야 합니다. 위의 예에서 -k1.5n바이트 5부터 필드 끝까지 작업하는 것은 키 사양이 다음과 같이 작동하기 때문입니다.

 -k[begin field].[first byte in key],[end field].[last byte in key]

따라서 이 경우 결과는 동일하지만 다음과 같이 열 때와 동일한 바이트에서 각 필드 범위를 닫을 수 있습니다.

sort -k1.5,1.5n -k1.1,1.1n

따라서 sort각 키는 1바이트로만 구성됩니다.

관련 정보