Usando o awk

Usando o awk

Gostaria de saber como posso verificar o final do arquivo no loop while. O que estou fazendo aqui é que se houver alguma palavra, como "abacaxi", "maçã", "cebola", "laranja" ou etc, quero encontrar linhas incluindo palavras específicas usando o comando grep e fazer algum comentário "janela". Por exemplo, se eu usar grep 'a' 'file', ele encontrará "abacaxi", "maçã" e "laranja". Então, finalmente quero imprimi-lo como "abacaxi, janela, maçã, janela, laranja, janela", algo assim. Então, eu gostaria de fazer alguma condição no loop while ou for. Qualquer ajuda será muito apreciada.

editar: exemplos de entradas

apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion

Resultados esperados ao usar o comando grep ->grep 'a' 'file name'

apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Responder1

Usando o awk

Para imprimir windowapós cada linha correspondente a:

$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Como funciona

/a/{...}seleciona linhas que correspondem ao regex a. Para cada linha, os comandos entre chaves são executados.

printimprime a linha que contém a correspondência

print "window"impressões window.

Usando sed

$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Como funciona

-ndiz ao sed para não imprimir, a menos que solicitemos explicitamente.

/a/{...}seleciona linhas que correspondem ao regex a. Para essas linhas, os comandos entre chaves são executados.

s/$/\nwindow/adiciona uma nova linha e windowapós o final da linha atual.

pimpressões.

Responder2

$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

grepIsso usa seu comando original e, em seguida, acrescenta a palavra windowapós cada linha resultante usando o acomando ("append") no GNU sed(o padrão sedrequer uma nova linha após \e no final do texto inserido, mas o GNU sedé um pouco mais tolerante).

Alternativamente, usando apenas GNU sed:

$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

A sedexpressão imprime cada linha que contém a letra ae depois anexa a string window.

Responder3

O shell way pode ser usado assim:

while IFS= read -r line || [ -n "$line" ]; do
    case "$line" in
        *a*) printf "%s\nwindow\n" "$line"
    esac
done < input.txt

while IFS= read -r line; do...done < file.txtIsso combina o loop típico para leitura de arquivos, caseinstrução para combinar linhas que contêm caracteres específicos e printfpara imprimir aquela windowlinha extra.

informação relacionada