AWK만 사용하면 단어가 20자를 초과하는 경우에만 단어 발생 횟수를 계산해야 합니다. 단어 빈도를 계산하는 방법을 찾았지만 이 매개변수를 설정하는 데 몇 가지 문제가 있습니다.
다음으로, 정의하고 싶은 동의어에서 이 단어들을 분리하되 한 단어는 건너뛰고 싶습니다.
내 말은, "hello"가 30번 나타나면 ,, ...가 여전히 "hello" 인 대신 , 등을 "hi"로 2nd
바꾸고 4th
싶다는 것입니다 .6th
1st
3rd
이것이 내가 한 일입니다:
BEGIN { FS="[^a-zA-Z]+" } {
for (i=1; i<=NF; i++) {
word = tolower($i)
words[word]++
}
}
END {
for (w in words)
printf("%3d %s\n", words[w], w)
}
답변1
네 말 뜻은:
BEGIN { flag=0; FS="[^a-zA-Z]+" } {
for (i=1; i<=NF; i++) {
word = tolower($i)
if ($0 ~ /hello/ ) {
if (flag) {
sub ("hello", "hi", word );
}
flag= !flag
}
words[word]++
}
}
END {
for (w in words)
printf("%3d %s\n", words[w], w)
}
위의 기능은 프로그램이 초기화될 때 a를 설정하는 것입니다 flag
.0
awk
파일 반복에서 hello
입력 문자열을 확인한 다음 발견되면 를 확인 hello
하고 로 변경하지 않습니다 .flag
flag
0
hello
hi
flag
그런 다음 (0 => 1, 1 => 0)의 값을 전환합니다.
다음 hello
에 발생하면 flag
값이 이고 1
to가 대체됩니다.hello
hi