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 proceder
other 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 nextfile
es una extensión de GNU awk o si también está disponible en otros awks. La mawk
pá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 BEGINFILE
bloque como:
BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
... remainder of awk script here ...