시스템 프로그래밍 과정에서는 샘플 텍스트를 검토하고 가장 일반적인 단어를 다른 문구로 바꿔야 했습니다. 불행히도 나는 명령 만 사용할 수 있습니다
tr
grep
egrep
sed
awk
uniq
wc
그리고 파이프라인. 가장 흔한 단어를 찾아 tr의 SET1에 사용하여 다른 문구로 대체할 수 있도록 하고 싶습니다. 이렇게 하려면 grep이나 sed 등과 관련된 줄/단어를 필터링해야 할 것 같습니다. 내 질문은 문구를 대체할 수 있도록 이것을 tr의 첫 번째 세트로 전달하는 방법입니다. 나는 awk에 대한 경험이 없습니다.
답변1
단일 문자(또는 바이트)에만 작동하므로 tr
이것을 사용하고 싶지 않을 것입니다 .tr
$ echo abc | tr cab taxi
axt
sed
특히 s///
(대체) 연산자를 살펴보는 것이 좋습니다 .
한 프로그램의 출력을 다른 프로그램의 명령줄로 파이프하는 경우 키워드는 다음과 같습니다.명령 대체.
(숙제라서 자세히 설명하지 않겠습니다...)
답변2
이 숙제는 2주 이상 지났으므로 내 해결책을 알려드리겠습니다(가장 일반적인 공백으로 구분된 단어를 문자열로 대체 FOO!
).
#!/usr/bin/awk -f { for (i = 1; i <= NF; ++i) if (NR == FNR) { if (++c[$i] > c[m]) m = $i } else { if ($i == m) $i = "FOO!" } }
NR != FNR
awk
이 스크립트는 명령줄에서 두 번 언급된 파일을 사용하여 호출해야 합니다.
$ ./script.awk file file
이 스크립트의 유일한 단점은 가장 일반적인 단어를 포함하는 줄의 공백이 단일 공백으로 압축된다는 것입니다.
위의 문제를 해결하는 변형(또는 적어도 더 나은 성능):
#!/usr/bin/awk -f NR == FNR { for (i = 1; i <= NF; ++i) if (++c[$i] > c[m]) m = $i }
NR != FNR { gsub(FS m FS, FS "FOO!" FS) print }