명령줄을 사용하여 고유 단어 수를 인쇄합니다.

명령줄을 사용하여 고유 단어 수를 인쇄합니다.

숙제가 있어요:

파일 alice에 몇 개의 고유한 단어가 있는지, 그리고 그 개수를 알아보세요. 정렬된 고유 단어를 alice_unique라는 파일에 인쇄합니다. 아포스트로피를 사용하여 단어를 분할하면 다른 특수 문자와 마찬가지로 올바르게 분할됩니다.

지금까지 나는 이것을 가지고 있습니다

tr -sc 'A-Za-z' '\012' < alice | sort | uniq -c > alice_unique

그런데 특수문자(',!,? 등)가 포함된 단어를 어떻게 조합해야 할지 모르겠습니다. 또는 고유 단어의 총 개수를 계산하는 방법입니다.

텍스트 파일 Alice(시작)

이상한 나라의 앨리스

루이스 캐럴

밀레니엄 펄크럼 버전 3.0

1장 토끼굴에 빠지다

앨리스는 할 일 없이 해변에 있는 여동생 옆에 앉아 있는 것에 싫증이 나기 시작했습니다. 그녀는 여동생이 읽고 있는 책을 한두 번 슬쩍 보았지만 그 안에는 그림이나 대화가 없었습니다. 앨리스는 "이게 또 뭐야?"라고 생각했습니다. 책이요, 그림도 없고 대화도 없나요?”

그래서 그녀는 데이지 체인을 만드는 재미가 일어나서 데이지를 따는 수고를 할 만큼 가치가 있는지 혼자서 생각하고 있었습니다(더운 날씨 때문에 너무 졸리고 멍청하다고 느꼈기 때문입니다). 분홍색 눈을 가진 토끼가 그녀를 지나쳐 달려왔습니다.

답변1

<alice tr -cd "[:alpha:][:space:]-'" |
  tr ' [:upper:]' '\n[:lower:]' |
  tr -s '\n' |
  sed "s/^['-]*//;s/['-]$//" |
  sort |
  uniq -c > alice_unique

한 줄씩:

  • 문자, 공백, 아포스트로피, 하이픈을 제외한 모든 항목을 제거합니다.
  • 공백을 줄 바꿈으로, 대문자를 소문자로 변환
  • 연속된 줄바꿈을 "압착"
  • 선행 또는 후행 아포스트로피 및 하이픈 제거
  • 단어 정렬
  • 각 고유 단어와 해당 단어가 나타나는 횟수를 표시합니다.

숫자를 단어로 계산해야 한다면 이는 잘못된 것입니다. 텍스트가 ASCII가 아니면 작동하지 않을 수 있습니다. ~을 위한이상한 나라의 앨리스아마도 이것으로 충분할 것입니다.

답변2

이것을 시도해보십시오. 텍스트 파일은 어디에 있습니까?

awk -- '{for (i = 1; i <= NF; i++) wc[$i] += 1}; END {for (w in wc) print w, wc[w]}' <file> | sort

기본적으로 awk는 입력 필드의 수를 제공하는 $1, $2, ...에서 최대 NF까지의 필드를 생성하여 입력의 각 행을 공백으로 분할합니다. 또한 모든 입력 행을 암시적으로 반복합니다. END 태그는 모든 라인이 처리된 후에 실행될 코드 블록을 제공합니다. 변수는 선언되지 않으며 대괄호는 연관 배열을 참조하는 데 사용됩니다.

awk 프로그램은 각 행의 각 단어를 취하여 해당 단어를 wc[]의 인덱스로 사용하고 개수를 추가합니다(정의되지 않은 경우 0으로 처리됨). 따라서 for 루프와 모든 줄의 암시적 외부 루프는 모든 고유 단어를 계산합니다(구두점으로 인해 다른 단어로 계산되지만 필요한 경우 쉽게 수정할 수 있습니다). 그런 다음 END 블록은 모든 단어와 해당 개수를 인쇄합니다.

나는 awk 프로그램을 복잡하게 만드는 대신 파이프 정렬을 사용하여 단어를 순서대로 배치합니다. 각 줄은 고유하므로 이전 "-u"도 제거했습니다.

답변3

다음은 AWK의 솔루션입니다. 이는 기본적인 해결 방법이므로 확장이 필요할 수 있습니다. 예를 들어, 성경을 분석한다면 단어에서 구절을 제외해야 합니다.

{
    if (NR == 1) { 
        sub(/^\xef\xbb\xbf/,"")
    }

    gsub(/[,;!()*:?.]*/, "")
    
    for (i = 1; i <= NF; i++) {

        w = $i
        words[w]++
    }
} 

END {

    print length(words)
}

프로그램은 BOM 문자를 제거합니다. 그렇지 않으면 단어가 "고유"해집니다. 일부 기본 구두점을 제거합니다. for 루프에서는 모든 필드의 개수를 계산합니다.

마지막으로 배열의 길이를 얻습니다.

관련 정보