Usando awk

Usando awk

Me pregunto cómo puedo comprobar el final del archivo en el bucle while. Lo que estoy haciendo aquí es que si hay alguna palabra, como "piña", "manzana", "cebolla", "naranja", etc., quiero encontrar líneas que incluyan palabras específicas usando el comando grep y hacer algún comentario. "ventana". Por ejemplo, si uso grep 'a' 'file', encontrará "piña", "manzana" y "naranja". Luego, finalmente quiero imprimirlo como "piña, ventana, manzana, ventana, naranja, ventana", algo como esto. Entonces, me gustaría crear alguna condición en el bucle while o for. Cualquier ayuda será muy apreciada.

editar: entradas de muestra

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

Resultados esperados al usar el comando grep -->grep 'a' 'file name'

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

Respuesta1

Usando awk

Para imprimir windowdespués de cada línea que coincida a:

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

Cómo funciona

/a/{...}selecciona líneas que coinciden con la expresión regular a. Para cada una de estas líneas, se ejecutan los comandos entre llaves.

printimprime la línea que contiene la coincidencia

print "window"impresiones window.

Usando sed

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

Cómo funciona

-nle dice a sed que no imprima a menos que así lo indiquemos explícitamente.

/a/{...}selecciona líneas que coinciden con la expresión regular a. Para esas líneas, se ejecutan los comandos entre llaves.

s/$/\nwindow/agrega una nueva línea y windowdespués del final de la línea actual.

phuellas dactilares.

Respuesta2

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

Esto usa su comando original grepy luego agrega la palabra windowdespués de cada línea resultante usando el acomando ("añadir") en GNU sed(el estándar sedrequiere una nueva línea después \y al final del texto insertado, pero GNU sedes un poco más indulgente).

Alternativamente, usando solo 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

La sedexpresión imprime cada línea que contiene la letra ay luego agrega la cadena window.

Respuesta3

La forma shell se puede utilizar así:

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

Esto combina el while IFS= read -r line; do...done < file.txtbucle típico para leer archivos, caseuna declaración para hacer coincidir líneas que contienen un carácter particular y printfpara imprimir esa windowlínea adicional.

información relacionada