awk -F, '{print $2}' file.csv extrae una columna en una línea, y para un CSV generado por una máquina ahí termina la historia. Para un CSV que viene de una hoja de cálculo hay una trampa que produce números incorrectos en vez de errores — así que vale la pena saber dónde está el límite.
1. Una columna
$ clai imprime la primera columna de data.csv→ awk -F, '{print $1}' data.csvnameAliceBob
-F, fija el separador de campos. Los campos son $1, $2, … y $0 es la línea completa.
2. Varias columnas, sin la cabecera
$ clai imprime las columnas 1 y 3 de data.csv sin la fila de cabecera→ awk -F, 'NR>1 {print $1, $3}' data.csvAlice 100Bob 250
NR>1 se salta la primera línea. NR es el número de registro, y usarlo como condición es la forma en que awk expresa «para las filas donde…».
3. Mantenerlo separado por comas a la salida
$ clai extrae las columnas 1 y 3 como csv válido→ awk -F, 'BEGIN{OFS=","} NR>1 {print $1,$3}' data.csvAlice,100Bob,250
print $1, $3 une los campos con OFS, que por defecto es un espacio. Fíjalo en BEGIN y la salida vuelve a ser CSV.
4. Sumar una columna
$ clai suma la tercera columna de data.csv→ awk -F, 'NR>1 {s+=$3} END {print "total", s}' data.csvtotal 350
Sin declarar variables, sin inicializarlas — en awk los números empiezan en cero. END se ejecuta una vez, después de la última línea.
5. Filtrar filas y luego tomar una columna
$ clai muestra los nombres donde el importe supera 200→ awk -F, 'NR>1 && $3 > 200 {print $1}' data.csvBob
Aquí es donde awk gana a una hoja de cálculo: el mismo one-liner recorre un archivo de 3 GB sin necesidad de abrirlo.
6. La trampa: una coma dentro de un campo entre comillas
$ clai imprime la segunda columna→ awk -F, 'NR>1 {print $2}' data.csvBerlin"Paris
La fila Bob,"Paris, France",250 tiene tres campos lógicos pero cuatro comas. Awk no sabe nada de comillas, así que $2 se convierte en "Paris, $3 en France", y la suma del paso 4 devuelve silenciosamente 100 en lugar de 350. No da un error — simplemente te da el número equivocado.
Trampas habituales
- Comprueba si hay comillas antes de confiar en un total.
grep -c '"' file.csv— si es cero, awk normal es seguro. Si no lo es, usa un parser de CSV de verdad:csvcut -c 1,3 data.csv(csvkit),mlr --csv cut -f name,amount(Miller), o tres líneas de Python. -F,no es lo mismo que-F', '. Un separador de coma-más-espacio produce campos vacíos en silencio en las filas que no tienen ese espacio.- Los finales de línea de Windows dejan un
\ren el último campo.$NFdeja de coincidir sin ninguna razón visible. Se arregla conawk -F, '{gsub(/\r$/,"")} …'o pasandodos2unixantes.
Preguntas relacionadas
¿Cómo imprimo la última columna? awk -F, '{print $NF}'. NF es el número de campos, así que $NF es el último y $(NF-1) el anterior.
¿Cómo uso un separador de tabulación? awk -F'\t' — entre comillas para que la shell no se coma la barra invertida.
¿Es awk más rápido que pandas para esto? Para extraer o sumar una columna de un archivo grande, sí, por mucho — procesa en streaming y nunca construye una estructura de datos. Para joins o reestructuración, usa pandas.
Ver también
- Buscar y reemplazar en todos los archivos de un proyecto
- Renombrar cientos de archivos: de bucles
fora lenguaje natural - De one-liner a script versionado: cuándo dar el salto
Describe la extracción que quieres; CliAI escribe el programa de awk, incluyendo el BEGIN{OFS=","} que se te olvidaría. Instálalo en una línea.