2012-01-29 5 views
7

나는 리눅스를위한 요리 책을 읽고있다. 나는 그것에 대해 상당히 새롭다.텍스트의 일치

필자는 텍스트의 일치도라는 주제에 대해 이야기합니다. 이제 나는 그것이 무엇인지 이해하지만, 일치어를 생성하는 tr, sort 및 uniq (요리 책이 말하는 것)를 사용하여 일련의 명령을 얻을 수는 없습니다.

누군가 기본 기본 문안 작성 방법을 알려 줄 수 있습니까? 즉, 각 고유 단어에 대한 단어 빈도를 정렬하고 표시합니다.

tr를 ​​사용하여 모든 공백을 개행 문자로 변환하여 각 단어가 새 행으로 바뀌고 분류기로 전달 된 후 -c 플래그를 사용하여 uniq로 전달되는 아이디어 고유 한 용어를 세어보십시오.

올바른 매개 변수를 알아낼 수 없습니다. 각 매개 변수가 무엇을 설명하는지 설명 할 수 있습니까?

나는 이것에 대해 봤지만 나는 내 문제에 대해 명확하게 정의 된 대답을 얻을 수 없다.

도움을 주시면 감사하겠습니다.

답변

0
tr ' ' '\n' <input | sort | uniq -c 

귀하의 의견을 올바르게 이해하면 디렉토리의 모든 파일에 대한 모든 단어의 합계가 필요합니다. 이 같은이 작업을 수행 할 수 있습니다

find mydir -type f -exec cat {} + | tr ' ' '\n' | sort | uniq -c 

find 재귀 인수와 일치하는 파일을 mydir을 검색합니다 : -type f이 디렉터리 또는 당신이하지 말았어야 몇 가지 다른 종류의 반대로 (정상 파일을 보관 만에 알려줍니다 걱정할 필요가 없다면) findcat을 실행하여 모든 파일 이름에 인수를 부여합니다. cat은 하나의 큰 파일처럼 모든 내용을 인쇄하여 파일을 연결합니다. 그 결과는 일치도를 실제로 계산하기 위해 동일한 tr/sort/uniq 파이프 라인을 통과합니다.

+0

지금은 (글자 그대로) 실행해야하지만 다른 사람이 없으면 돌아올 때 설명하겠습니다. 한편, 맨 페이지를 읽으십시오. – Kevin

+0

고마워요. 그거야. 나는 그것을 해체하고 이해하려고 노력할 것이다. –

+0

오케이. 알았다. 하나의 질문이지만, 단일 디렉토리에서 일부 파일의 일치를 만들기 위해 이것을 확장 할 수 있습니까? 한 가지 방법은 "ls"의 결과를 파일에 저장 한 다음 해당 파일의 각 행에 파일 이름을 저장하고 위의 명령을 실행하여 "result"에 해당 파일의 일치를 추가하는 것입니다. 그런 다음 "결과"에 대한 조화를 다시하십시오. 이것은 작동하지만, 이것을 달성하기위한보다 단순하고 우아한 방법이 있습니까? –

1

이렇게하는 방법은 여러 가지가 있지만 내 해결책입니다. 그것은 당신이 언급 한 것과는 다른 명령을 사용하지만, sed과 마지막`정렬을 사용하면보다 바람직한 출력을 낼 수 있습니다.

find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n 

find . -type f -print0 현재 디렉토리의 모든 폴더와 파일을 아래쪽으로 재귀 적으로 검색합니다. -type f은 파일 만 반환합니다. -print0은 특수한 \0 문자를 사용하여 파일 이름을 끝내며 공백이 파이프의 다음 명령과 혼동하지 않도록합니다.

xargs은 입력을 받아 명령의 인수 (이 경우 cat)로 바꿉니다. cat은 주어진 모든 파일의 내용을 인수로 인쇄합니다. -0은 xargs에 입력이 공백이 아닌 \0 특수 문자로 구분된다는 것을 알려줍니다.

sed은 패턴 일치 스트림 편집기입니다. 첫 번째 sed 명령은 [[:punct:]] 패턴을 사용하여 모든 문장 부호를 (s)으로 대체하고 구두점을 아무 것도 사용하지 않습니다. 주어진 각 줄의 모든 패턴과 일치합니다 (g).

두 번째 sed 명령은 입력 문자열 (g)을 통해 행에있는 하나 이상의 공백()의 모든 인스턴스를 줄 바꿈 (\n)으로 바꿉니다.

sort은 사전 순으로 단어를 구성합니다.

uniq -c은 얼마나 많은 출력이 있는지 계산하면서 출력 목록에서 인접한 중복을 제거합니다.

sort -n은이 출력을 단어 빈도별로 정렬 된 단어 목록을 숫자로 정렬합니다.

sedxargs은 특히 함께 사용하는 경우 매우 강력한 명령입니다. 그러나 다른 포스터가 지적한대로 find도 거의 제한되지 않은 권력을 가지고 있습니다. tr이 유용하지만 sed보다 구체적입니다.

+0

이것은 아주 좋습니다! 개선 된 기능 (다른 답변보다)을 가져 주셔서 감사합니다. –