2013-02-06 2 views
2

여러 텍스트 파일을 가져 와서 실행 횟수로 단어를 출력하는 실행 파일을 만들려고합니다. 이 bash는 스크립트에서 수행되어야하고, 내가 지금까지있는 것은 :여러 파일에 단어 분포를 인쇄하십시오.

#!/bin/bash 
y=$(cat $* | wc -w) 

cat $* | tr ' ' '//' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | 
grep -v '[^a-z]'| sort | uniq -c | sort -rn | head -$y 

나는 오류가 y을 설정하려고하고 나는 다른 모든 단어를 출력 head을 얻을 방법을 알아낼 수 없습니다 얻을.

더 좋은 방법이 있습니까?

+0

'고양이'(두 번 모두)를 사용하는 것이 좋습니다. UUOC 어워드가 없습니다! –

답변

1

head을 실행해야하나요? 파일에 단어가있는 것처럼 많은 단어가 있다는 보장은 없습니다. 실제로, (실제로는 반복되는 단어가 있기 때문에) 존재하지 않을 것이라고 보장됩니다. 그리고 모든 데이터를보고 싶다면 모든 데이터를 표시하십시오. sort -nr의 출력을 필터링하지 마십시오.

첫 번째 tr에는 슬래시가 하나만 필요합니다. 보통 공백과 구두점을 줄 바꿈에 매핑합니다 (-s 옵션을 tr으로 지정하면 인접 줄 바꿈을 하나로 줄임). 첫 번째 tr의 슬래시는 세 번째 tr의 구두점으로 계산되므로 사용자가 그 곳까지 무엇인지 분명하지 않습니다. 나는 같은 것을 볼 것으로 예상 거라고 생각 :

cat "[email protected]" | 
tr -cs '[:alpha:]' '\n' |  # Convert any non-alpha character to newline 
tr '[:upper:]' '[:lower:]' | # Case-convert to lower case 
sort | uniq -c | sort -nr 

참고 "[email protected]"보다는 $*의 사용; 지정한 파일 이름에 공백 (개행, 탭 등)이 포함되지 않은 경우에는 아무런 차이가 없습니다. 그럴 경우 "[email protected]" 양식이 정확하고 $*이 아니므로 항상 "[email protected]"을 사용할 수 있습니다. $*보다 훨씬 더 정확합니다. 나는 주위에 거짓말을했던 일부 C 소스 코드에 대한

, 스크립트의 출력했다 : 단어 '시간'은 '포함'이라는 단어만큼 자주 나타납니다

246 n 
217 i 
153 int 
141 list 
124 if 
118 t 
103 char 
    99 a 
    97 size 
    90 buffer 
    89 context 
    82 d 
    81 void 
    79 include 
    79 h 
    78 s 
    65 for 
    62 j 
    55 ptr 
    54 r 
    54 const 
    53 static 
    53 sem 
    51 pthread 
    49 z 
    49 oldneedle 
    49 err 
    47 to 
    47 return 
    46 mutex 
    44 printf 
    43 error 
    43 c 

하는 것으로, 그 이유가 있습니다! 단어 t은 많이 나타납니다. 예를 들어, size_t은 필터링을 통해 두 단어로 처리되기 때문입니다. 밑줄 보존이 가능합니다. 첫 번째 tr'[:alpha:]_' (밑줄에 유의하십시오)을 사용하도록 변경하십시오. 자릿수를 삭제했지만 원하는 경우 자릿수를 유지할 수도 있습니다.

+0

나는 이것을 시험해 보았고 나는 여전히 터미널에 출력을 얻지 못했다. 나는 wd라는 스크립트의 이름을 지정하고 [./wd file.txt]를 사용하여 실행했다. 여기서 file.txt는 입력 된 파일이다 – BulletB

+0

정말요? 흠, 놀랍습니다. 오류 메시지가 없습니다. 단계별로 디버깅해야합니다. (물론 저에게 도움이되었으므로 샘플 출력을 생성 한 것입니다.) 이런 상황에서 내가하는 일은'tmp = $ {TMPDIR : -/tmp}/wd. $$; 고양이 "$ @"| 티 $ tmp.1 | tr -cs '[: alpha :]' '\ n'| 티 $ tmp.2 | ... ', 걱정하는 각 파이프 뒤에'tee $ tmp.N'을 추가합니다. 여기,'cat' 이후의 것에 대해서는 걱정하지 말고'sort | 유니크 -c | sort -nr'; 'tr' 명령 다음에 하나씩 추가하십시오. 스크립트를 실행하고 첫 번째 임시 파일을보십시오. 그것이 틀린 경우, 우리는 무엇을 고쳐야할지 압니다. –

+0

이걸 터미널에 넣고 있습니까? 아니면 스크립트입니까? – BulletB

관련 문제