Usando a saída de um comando como um conjunto para tr

0

Para o meu curso de programação de sistemas, devo passar por uma amostra do texto e substituir a palavra mais frequente por outra. Infelizmente, só posso usar os comandos

tr
grep
egrep
sed
awk
uniq
wc

bem como tubulação. Cheguei até a encontrar a palavra mais frequente e gostaria de usá-la em SET1 para tr, para que eu possa substituí-la pela outra frase. Para fazer isso, eu imagino que tenho que filtrar a linha / palavra que é relevante com algo como grep ou sed. Minha pergunta é, então, como eu passaria isso como o primeiro conjunto para que eu pudesse substituir a frase. Eu não tenho experiência com o awk.

    
por Ohunter 23.01.2018 / 23:35

2 respostas

1

Você provavelmente não deseja usar tr para fazer isso, pois tr só funciona em caracteres individuais (ou bytes):

$ echo abc | tr cab taxi
axt

Eu recomendaria dar uma olhada no sed e especialmente no operador s/// (substituto).

Quanto a passar a saída de um programa para a linha de comando de outro, a palavra-chave é substituição de comando .

(não vou entrar em mais detalhes, já que esta foi a lição de casa ...)

    
por 23.01.2018 / 23:48
0

Como essa tarefa de casa tem mais de duas semanas, eu darei a minha solução (substitui a palavra separada por espaço em branco mais frequente pela string 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

Este script awk deve ser invocado com o arquivo mencionado duas vezes na linha de comando:

$ ./script.awk file file

A única desvantagem deste script é que os espaços em branco nas linhas que contêm a palavra mais frequente serão compactados em um único espaço.

Variação que corrige o problema mencionado acima (ou pelo menos se comporta melhor):


#!/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 }
    
por 10.02.2018 / 23:26