es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estoy experimentando un error extraño (no es un error) con AWK

Estaba trabajando con un archivo de texto llamado countries cuyo contenido es el siguiente:

USSR    8649   275    Asia
Canada  3852   25     América del Norte
China   3705   1032   Asia
USA     3615   237    América del Norte
Brasil  3286   134    América del Sur
India   1267   746    Asia
México  762    78     América del Norte
Francia 211    55     Europa
Japón   144    120    Asia
Alemania    96     61     Europa
Inglaterra  94     56     Europa

Estoy tratando de hacer funcionar el siguiente patrón de rango:

awk '/Europa/, /Asia/' countries

que se supone que imprime cada línea desde la primera aparición de la palabra “Europa” hasta la primera aparición de la palabra “Asia”.

Entonces el resultado que esperaba era este:

Francia  211    55     Europa
Japón   144    120    Asia

Pero en lugar de eso, obtengo este resultado:

Francia  211    55     Europa
Japón   144    120    Asia
Alemania    96     61     Europa
Inglaterra  94     56     Europa

como si el segundo patrón no se estuviera cumpliendo. ¿Qué está sucediendo?

Tags:  

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en awk, puedo explicar que el comando awk '/Europe/, /Asia/' countries coincide con cada línea que comienza desde la primera aparición de la palabra “Europe” y termina en la primera aparición de la palabra “Asia”. Sin embargo, dado que la palabra “Europe” también aparece después de la palabra “Asia” en el archivo, awk continúa imprimiendo líneas hasta llegar al final del archivo.

    Para limitar la coincidencia de patrones a la primera aparición de la palabra “Asia”, debes agregar una condición adicional para detener el procesamiento del archivo una vez que se encuentre la primera coincidencia con “Asia”. Puedes lograr esto utilizando el comando next para saltar el procesamiento de las líneas restantes después de la primera coincidencia con “Asia”.

    El comando corregido es:

    awk '/Europe/, /Asia/{print; if(/Asia/) next;}' countries
    

    Esto generará el resultado esperado:

    France  211    55     Europe
    Japan   144    120    Asia
    

    ¡Espero que esto te sea útil!

Comments are closed.