2012-05-19 2 views
6

단어 목록을 포함하는 list.txt 파일이 있습니다. 각 단어가 다른 파일에 얼마나 많이 나타나는지 확인하려면 file1.txt을 입력하고 결과를 출력하십시오. 스프레드 시트 프로그램을 사용하여 수동으로 숫자를 list.txt에 추가 할 수 있기 때문에 모든 숫자를 간단하게 출력 할 수 있지만 각 줄 끝의 숫자를 스크립트에 추가하면 더 좋은 결과를 얻을 수 있습니다 (예 :단어 목록의 각 단어가 파일에 몇 번 표시됩니까?

bear 3 
fish 15 
).

나는이 시도했다, 그러나 그것은 작동하지 않습니다

cat list.txt | grep -c file1.txt 
+1

입력 파일 형식을 언급하는 것을 잊었습니다. 한 줄에 한 단어 씩? "단어"에 공백이있을 수 있습니까? grep 할 데이터 세트는 어떻습니까? – 0xC0000022L

+0

'list.txt1'은 한 줄에 하나의 단어입니다. 한 단어에는 공백이있을 수 있습니다. 'file1.txt'의 데이터는 많은 문장이지만, 한 줄은 여러 줄을 넘기지 않습니다. – Village

답변

8
그런 다음 단어 목록 파일에서 한 번에 하나의 단어를 읽고, 루프에서이 작업을 수행 할 수 있습니다

가있는 경우를 계산 데이터 파일. 예를 들어

while read; do 
    echo -n "$REPLY " 
    fgrep -ow "$REPLY" data.txt | wc -l 
done < <(sort -u word_list.txt) 

은 "비밀 소스는"구성 암시 REPLY 변수를 사용

  1. ;
  2. 단어 목록 파일에서 단어를 수집하는 프로세스 대체를 사용합니다.
  3. 데이터 파일의 전체 단어를 그립니다.
+3

실제 일치 횟수가 아닌 일치하는 줄 수를 계산합니다 (한 줄에 일치하는 항목이 여러 개있는 경우 하나만 포함). 이론 상으로는,'fgrep -o -c'가이 문제를 수정해야하지만, 일부 최신 GNU 버전의 coreutils에서는 제대로 작동하지 않습니다. – tripleee

+1

대단한 잡기, @ 삼인조. 그것은 제가 생각하지 않은 최악의 경우였습니다. 사용 사례를 해결하기위한 답을 업데이트했습니다. –

3

당신 (GNU이 나오지도)에 대한이 작동 될 수 있습니다

tr -s ' ' '\n' file1.txt | 
sort | 
uniq -c | 
sed -e '1i\s|.*|& 0|' -e 's/\s*\(\S*\)\s\(\S*\)\s*/s|\\<\2\\>.*|\2 \1|/' | 
sed -f - list.txt 

설명 :

    단어에
  • 분할 file1.txt
  • 정렬 단어
  • 단어를 카운트
  • 매트에 sed 스크립트 만들기 채널 단어 (처음에 각 단어를 제로)
  • 실행에만이 AWK 방법은 한 번에 각 파일을 통해 전달하는 list.txt
4

에 대한 위의 스크립트 :

awk ' 
    # read the words in list.txt 
    NR == FNR {count[$1]=0; next} 
    # process file1.txt 
    { 
    for (i=0; i<=NF; i++) 
     if ($i in count) 
     count[$i]++ 
    } 
    # output the results 
    END { 
    for (word in count) 
     print word, count[word] 
    } 
' list.txt file1.txt 
+0

+1 정렬 없음, 입력을 통한 단일 패스, 임시 파일 없음. 출력에서'list.txt'의 순서를 보존하고 싶다면, 두번째 배열의 인덱스를'NR == FNR' 케이스에 추가하는 것은 쉽습니다. – tripleee

1

한 줄의 명령

cat file1.txt |tr " " "\n"|sort|uniq -c |sort -n -r -k 1 |grep -w -f list.txt 

명령의 마지막 부분은 grep이 list (-f 옵션)에서 일치시킬 단어를 읽고 전체 단어 (-w)와 일치하도록합니다. 즉 list.txt c ontains는 자동차를 포함하고, grep은 캐리지를 무시해야합니다.

그러나 전체 단어 및 grep보기가 다를 수 있음을 명심하십시오. 예를 들면. 자동차가 객차와 일치하지 않더라도 세차장과 일치하며 "-"가 단어 경계로 간주됩니다. grep은 문자, 숫자 및 밑줄을 제외한 모든 것을 단어 경계로 사용합니다. 이것은 영어로 허용되는 단어 정의와 일치하므로 문제가되지 않습니다.

관련 문제