CLI AI

Imprimir una columna de un CSV con awk (y cuándo no)

2026-05-06

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
$ 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
$ 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
$ 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
$ 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
$ 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
$ 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 \r en el último campo. $NF deja de coincidir sin ninguna razón visible. Se arregla con awk -F, '{gsub(/\r$/,"")} …' o pasando dos2unix antes.

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

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.