awk 공백을 새 줄로 바꾸는 동시에 빈 줄을 제거하는 방법은 무엇입니까?

awk 공백을 새 줄로 바꾸는 동시에 빈 줄을 제거하는 방법은 무엇입니까?

txt 파일의 각 단어 수를 계산하려고 합니다.

워드.txt

the day is sunny the the
the sunny is is

예상되는 결과:

the 4
is 3
sunny 2
day 1

나는 원해요

1) 모든 공백을 새 줄로 바꿉니다.

awk -v RS=" " '{print}' words.txt

결과

the
day
is
sunny
the
the
the
sunny
is
is
    #empty line 

2) 빈 줄 삭제

awk 'NF>0 {print}' words.txt |sort | uniq -c |sort -bnr

결과

1 the sunny is is
1 the day is sunny the the

위의 2개 스크립트를 한 줄의 코드로 결합하여 예상한 결과를 생성하려면 어떻게 해야 합니까?

답변1

특히 작업을 단일 스크립트로 결합하려는 경우 공백을 줄 바꿈 등으로 변경하여 텍스트를 전처리할 필요가 없습니다 awk.

$ awk '{ for (i=1; i<=NF; ++i) count[$i]++ } END { for (word in count) print count[word], word }' file
4 the
2 sunny
3 is
1 day

공백으로 구분된 각 단어를 살펴보고 개수를 셉니다. 개수는 count단어로 인덱스된 배열에 저장됩니다. 마지막으로 개수와 해당 단어가 출력됩니다. 빈 줄에는 단어가 포함되어 있지 않으므로 자동으로 건너뜁니다.

이것을 정렬해야 한다면 파이프로 연결하세요 sort -n.

GNU를 사용하는 경우 awk해당 asorti()기능을 사용하여 블록 단위로 정렬 할 수 있습니다 END.

END {
    n = asorti(count, c2, "@val_num_desc")
    for (i=1; i<=n; i++ )
        printf("%d %s %s\n", i, count[c2[i]], c2[i])
}

답변2

@Kusalananda는 이미 좋은 awk 솔루션을 제공했지만 다음도 제공했습니다.

$ tr ' ' '\n' < file | sort | uniq -c
      1 day
      3 is
      2 sunny
      4 the

답변3

GNU grep이 있는 경우 -o( --only-matching) 옵션을 사용하여 한 줄에 하나의 일치 항목을 표시할 수 있습니다.

grep -o '\S\+' words.txt

sort그런 다음 이전과 같이 and 로 파이프하십시오 uniq.

관련 정보