텍스트 파일에서 가장 일반적인 단어를 표시하고 똑같이 일반적인 단어를 알파벳 순서로 표시하는 방법

텍스트 파일에서 가장 일반적인 단어를 표시하고 똑같이 일반적인 단어를 알파벳 순서로 표시하는 방법

나는 지금까지 매우 가깝습니다. 스크립트는 단어를 정렬하고 가장 일반적인 단어부터 가장 덜 일반적인 단어까지 표시하지만 단어가 동일하게 공통적인 경우 정렬해야 합니다.

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과 같은 일부 구현이 수행됩니다.기준권장) 여전히 동일하게 정렬된 행에 대해 최종 바이트별 정렬 단계가 수행됩니다.
적어도 sortGNU 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기본적으로 이를 수행합니다.)

관련 정보