Analizar el archivo con Awk solo cuando la primera fila coincida con el patrón

Analizar el archivo con Awk solo cuando la primera fila coincida con el patrón

Necesito interrogar el encabezado de un archivo CSV y, si existe una columna, proceder con las filas de datos. El contexto es cuando los datos contienen columnas dependiendo de cuándo y qué los emitió.

Se espera una solución Awk "pura" para mantener la lógica empresarial en un lenguaje común, pero si esto no es posible, se interesan enfoques que entreguen selectivamente archivos con el encabezado que coincida con el script Awk.

Usar la última versión de Gawk siempre es una opción.

Edite para agregar pseudocódigo:

si la columna en el encabezado (NR==1): luego continúe con el resto del archivo; de lo contrario, deje de procesar el archivo

Respuesta1

para enumerar archivos:

intentar

awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |

que seleccionará todos los archivos que tengan lo que sea en la cuarta columna.

Si tiene un nombre gracioso, simplemente agregue comillas.

awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |

para procesar un archivo

awk 'NR == 1 && $4 != "whatever" { exit ;}  other patterns { other action;}' file

para procesar muchos archivos

awk 'NR == 1 && $4 != "whatever" { nextfile ;}  other patterns { other action;}' file1 ... filen

que podría leerse como

  • SI (condición no cumplida)NR == 1 && $4 != "whatever"
  • ENTONCES salta este archivo{ nextfile ;}
  • DE LO CONTRARIO procederother patterns { other action;}

Respuesta2

Suponiendo un archivo simple delimitado por comas donde cada coma es un delimitador (algunos archivos csv pueden tener comas entre comillas que no deben tratarse como separadores de campos), lo siguiente imprime cada línea excepto el encabezado cuando una columna en el encabezado es "SOMESTRING ":

awk -F, '
    FNR==1 {
        for (i=1; i<=NF; i++) 
            if ($i == "SOMESTRING")
                next
        nextfile
    }
    1
' file1 file2 file3 file4

La comparación de cadenas se puede reemplazar con una prueba de subcadena o una operación de coincidencia de expresión regular, si corresponde.

nextfile no forma parte de POSIX AWK, pero está muy extendido; está disponible al menos en gawk, nawk (usado en sistemas *BSD), mawk y Busybox.

Respuesta3

awk 'FNR==1 && ! /whatever/ { nextfile } ; ...remainder of awk script here...' list_of_files_to_process

Esto debería pasar al siguiente archivo a procesar a menos que "lo que sea" esté en la línea 1.

No recuerdo si nextfilees una extensión de GNU awk o si también está disponible en otros awks. La mawkpágina de manual no lo menciona, pero sí se menciona en la página de manual de original-awk. Si es importante para usted, verifíquelo antes de confiar en la función.

Si estás usando GNU awk, es posible que quieras poner esa prueba en un BEGINFILEbloque como:

 BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
 ... remainder of awk script here ...

información relacionada