Linux에서 awk 대신 sed 및 tr 사용

Linux에서 awk 대신 sed 및 tr 사용
#!
awk '{ for (i=1; i<=NF; i++) no[$i]++
} END{ for (word in no) printf "%-15s%5d\n", word, no[word]
}' $* 

이것은 단어와 그 반복을 표시하는 명령에 대한 설명이므로 awk 대신 sed 및 또는 tr을 사용하고 싶고 구두점을 무시하고 대소 문자를 구분하지 않기를 원합니다.

답변1

단어와 최대 개수를 알고 있는 경우 tr및 를 사용하여 "계산"하는 것이 실제로 가능합니다 sed. 하지만 이것은 흥미롭지 않기 때문에 한 단어에 대해서만 이 작업을 수행하고 해당 단어가 4번 이하로 나타날 경우에만 수행합니다.

입력 파일:

foo bar
foo bar baz
bar baz
foo

악몽 sed:

$ tr '\n' ' ' <input |
  sed -r ': start; s/((^|[^%]))foo\b/\1%foo/; T end; s/%foo/%%foo/; t start; '\
': end; : delstart; s/(foo.*) %foo\b/\1/g; t delstart' |
  tr ' ' '\n' |
  sed -r 's/^%%%%/4 /; s/^%%%/3 /; s/^%%/2 /; s/^%/1 /'

4 foo
bar
bar
baz
bar
baz

%단어 바로 앞에 "count 문자"(여기서는 )가 나타나면 아무런 효과가 없습니다.

관련 정보