
입력하다:
$ 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의 후행 숫자 부분을 기준으로 정렬됩니다.OO
FOO
sort
OO2, OO5 and OO1
OO
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바이트로만 구성됩니다.