나는 지금까지 매우 가깝습니다. 스크립트는 단어를 정렬하고 가장 일반적인 단어부터 가장 덜 일반적인 단어까지 표시하지만 단어가 동일하게 공통적인 경우 정렬해야 합니다.
cat > file.txt
tr -c '[:alpha:]' '[\n*]' < file.txt |
sed -r '/^.{,5}$/d' | sort | uniq -c | sort -nr | head -20 | cut -c 9-
어떤 아이디어라도 대단히 감사하겠습니다!
답변1
sort -nr
행을 역순으로 정렬합니다. 키가 지정되지 않았으므로 이는 숫자로 시작하고 하나 이상의 공백 문자가 앞에 올 수 있는 줄에서만 작동합니다. 초기 번호별로 정렬한 후 다음 sort
과 같은 일부 구현이 수행됩니다.기준권장) 여전히 동일하게 정렬된 행에 대해 최종 바이트별 정렬 단계가 수행됩니다.
적어도 sort
GNU coreutils에서는 이 -r
옵션이 마지막 비교에도 적용되어 결과는 다음과 같습니다.
$ printf '%s\n' '2 foo' '1 baz' '1 bar' '2 quux' | sort --debug -nr
sort: text ordering performed using ‘en_US.UTF-8’ sorting rules
2 quux
_
______
2 foo
_
_____
1 baz
_
_____
1 bar
_
_____
찾고 있는 정렬 명령은 다음과 같습니다.
sort -b -k 1,1nr -k 2,2
k
두 개의 ey가 지정됩니다. 첫 번째는 필드 1에서 시작하고 끝나며 n
숫자 및 r
적수 수정자가 적용됩니다. 두 번째는 필드 2에서 시작하고 끝나며 수정자가 적용되지 않습니다. 즉, 현재 로케일 정렬의 규칙에 따릅니다. 이 -b
옵션을 사용하면 sort
각 정렬 키 시작 부분의 공백 문자가 무시됩니다(첫 번째 필드와 두 번째 필드 사이의 구분 기호가 고정되어 있는 경우에는 실제로 필요하지 않음).
할 수 있는 작업:
$ printf '%s\n' '2 foo' '1 baz' '1 bar' '2 quux' | sort --debug -b -k 1,1nr -k 2,2
sort: text ordering performed using ‘en_US.UTF-8’ sorting rules
2 foo
_
___
_____
2 quux
_
____
______
1 bar
_
___
_____
1 baz
_
___
_____
답변2
GNU sort
또는 호환 버전 의 경우 -s
두 번째 정렬 옵션을 사용하면 동일한 숫자 값을 가진 행의 순서가 바뀌는 것을 방지할 수 있습니다.
... | sort | uniq -c | sort -rns
(NetBSD의 구현은 sort
기본적으로 이를 수행합니다.)