명령의 출력을 tr 컬렉션으로 사용

명령의 출력을 tr 컬렉션으로 사용

시스템 프로그래밍 과정에서는 샘플 텍스트를 검토하고 가장 일반적인 단어를 다른 문구로 바꿔야 했습니다. 불행히도 나는 명령 만 사용할 수 있습니다

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 }

관련 정보