Los archivos CSV (Comma-Separated Values) son ampliamente utilizados para intercambiar información entre aplicaciones, bases de datos, servidores y herramientas de análisis.
Si trabajas como administrador Linux, DBA, DevOps o Production Support, es común recibir archivos CSV que contienen miles o incluso millones de registros.
Una tarea muy frecuente consiste en extraer solamente una columna.
En este artículo veremos diferentes formas de obtener los valores de la quinta columna de un archivo .csv utilizando comandos Linux, desde soluciones sencillas con cut hasta alternativas más potentes con awk.
Archivo CSV de ejemplo
Supongamos que tenemos el archivo:
employees.csv
con la siguiente información:
employee_id,first_name,last_name,department,salary,country
1001,John,Smith,IT,85000,USA
1002,Maria,Lopez,Finance,92000,Mexico
1003,Peter,Johnson,Sales,78000,USA
1004,Ana,Ramirez,IT,88000,Mexico
1005,Robert,Williams,HR,72000,Canada
Tenemos seis columnas:
| Posición | Columna |
|---|---|
| 1 | employee_id |
| 2 | first_name |
| 3 | last_name |
| 4 | department |
| 5 | salary |
| 6 | country |
Nuestro objetivo será obtener:
salary
85000
92000
78000
88000
72000
Método 1: utilizando cut
Una de las soluciones más sencillas es utilizar:
cut
El comando sería:
cut -d',' -f5 employees.csv
¿Qué significa?
cut
│
├── -d',' → utiliza la coma como delimitador
│
└── -f5 → selecciona el campo número 5
Resultado:
salary
85000
92000
78000
88000
72000
Esta probablemente sea la solución más sencilla cuando trabajamos con un CSV básico.
Método 2: cut eliminando el encabezado
Normalmente no queremos incluir:
salary
Podemos combinar tail con cut:
tail -n +2 employees.csv | cut -d',' -f5
Resultado:
85000
92000
78000
88000
72000
La opción:
tail -n +2
significa:
Mostrar el archivo comenzando desde la línea número 2.
Por lo tanto, eliminamos el encabezado antes de procesar los datos.
Método 3: utilizando awk
awk es una de las herramientas más poderosas disponibles en Unix/Linux para procesar información estructurada.
Podemos obtener la quinta columna utilizando:
awk -F',' '{print $5}' employees.csv
Aquí:
-F',' → define la coma como separador
$1 → primera columna
$2 → segunda columna
$3 → tercera columna
$4 → cuarta columna
$5 → quinta columna
Resultado:
salary
85000
92000
78000
88000
72000
Método 4: awk sin mostrar el encabezado
Podemos pedirle directamente a awk que ignore la primera línea:
awk -F',' 'NR > 1 {print $5}' employees.csv
La variable:
NR
significa Number of Record, que en este caso representa el número de línea que awk está procesando.
Por lo tanto:
NR > 1
significa:
Procesar únicamente las líneas posteriores a la primera.
Resultado:
85000
92000
78000
88000
72000
Esta solución evita utilizar tail.
Método 5: awk indicando explícitamente el separador de salida
También podemos utilizar las variables FS y OFS.
awk 'BEGIN {FS=","; OFS=","} {print $5}' employees.csv
FS significa:
Field Separator
mientras que OFS significa:
Output Field Separator
Para extraer una sola columna, OFS no es estrictamente necesario, pero resulta muy útil cuando queremos imprimir varias columnas.
Por ejemplo:
awk 'BEGIN {FS=","; OFS=","} {print $2,$5}' employees.csv
Resultado:
first_name,salary
John,85000
Maria,92000
Peter,78000
Ana,88000
Robert,72000
Método 6: utilizando sed con una expresión regular
También podemos utilizar sed.
Por ejemplo:
sed 's/^\([^,]*,\)\{4\}\([^,]*\).*/\2/' employees.csv
Conceptualmente, la expresión busca:
columna1,
columna2,
columna3,
columna4,
columna5
y conserva el quinto valor.
Aunque funciona con archivos sencillos, esta solución es menos legible que:
cut
o:
awk
Por esa razón, normalmente preferiría cut o awk para este tipo de tareas.
Método 7: utilizando Perl
En servidores donde Perl está disponible podemos utilizar:
perl -F',' -lane 'print $F[4]' employees.csv
Aquí aparece una diferencia importante.
Perl comienza a numerar el array desde:
0
Por lo tanto:
$F[0] → columna 1
$F[1] → columna 2
$F[2] → columna 3
$F[3] → columna 4
$F[4] → columna 5
Así que para obtener la quinta columna utilizamos:
$F[4]
Método 8: utilizando Python desde Linux
En sistemas que tienen Python instalado también podemos procesar el archivo directamente desde la línea de comandos.
Una opción compacta sería:
python3 -c 'import csv,sys; [print(r[4]) for r in csv.reader(sys.stdin)]' < employees.csv
Una ventaja importante es que el módulo csv entiende mejor la estructura real de un archivo CSV que herramientas como cut.
Esto será importante más adelante.
Buscar solamente valores específicos
Una vez que podemos extraer la quinta columna, podemos combinarla con otros comandos Linux.
Por ejemplo, mostrar salarios superiores a 80,000:
awk -F',' 'NR > 1 && $5 > 80000 {print $5}' employees.csv
Resultado:
85000
92000
88000
Mostrar nombre y salario
Podemos imprimir múltiples columnas con awk:
awk -F',' 'NR > 1 {print $2, $5}' employees.csv
Resultado:
John 85000
Maria 92000
Peter 78000
Ana 88000
Robert 72000
También podemos darle formato:
awk -F',' 'NR > 1 {print "Employee:", $2, "Salary:", $5}' employees.csv
Resultado:
Employee: John Salary: 85000
Employee: Maria Salary: 92000
Employee: Peter Salary: 78000
Employee: Ana Salary: 88000
Employee: Robert Salary: 72000
Obtener valores únicos de la quinta columna
Supongamos que la quinta columna no contiene salarios sino valores que pueden repetirse.
Podemos obtener los valores únicos utilizando:
cut -d',' -f5 employees.csv | sort -u
O con awk:
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -u
Ordenar los valores
Para ordenar numéricamente los valores:
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -n
Para ordenarlos de mayor a menor:
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -nr
Resultado:
92000
88000
85000
78000
72000
Encontrar el valor más alto
Podemos combinar nuestros comandos:
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -nr | head -1
Resultado:
92000
También podemos resolverlo directamente con awk:
awk -F',' 'NR > 1 && $5 > max {max=$5} END {print max}' employees.csv
Encontrar el valor más bajo
Utilizando las herramientas tradicionales:
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -n | head -1
Resultado:
72000
Guardar la quinta columna en otro archivo
Otra operación muy común es extraer la información y almacenarla.
Por ejemplo:
cut -d',' -f5 employees.csv > salaries.txt
O:
awk -F',' 'NR > 1 {print $5}' employees.csv > salaries.txt
Después podemos verificar el resultado:
cat salaries.txt
Contar cuántos valores existen
Podemos utilizar:
awk -F',' 'NR > 1 {print $5}' employees.csv | wc -l
Esto nos indica cuántos registros fueron procesados.
¿Cuál método debemos utilizar?
Para archivos CSV sencillos:
cut -d',' -f5 employees.csv
es probablemente la solución más rápida y fácil de recordar.
Cuando necesitamos filtros, condiciones o procesamiento adicional:
awk -F',' 'NR > 1 {print $5}' employees.csv
normalmente será más flexible.
Podemos resumirlo así:
| Método | Comando | Ventaja |
|---|---|---|
| cut | cut -d',' -f5 | Muy sencillo |
| tail + cut | tail -n +2 | cut -d',' -f5 | Elimina encabezado |
| awk | awk -F',' '{print $5}' | Flexible |
| awk + NR | awk -F',' 'NR > 1 {print $5}' | Flexible y elimina header |
| sed | Expresión regular | Disponible en casi todo Unix/Linux |
| Perl | perl -F',' ... | Potente para scripting |
| Python csv | csv.reader() | Mejor para CSV reales/complejos |
Cuidado: un CSV no siempre es simplemente texto separado por comas
Este es probablemente el punto más importante del artículo.
Supongamos que tenemos:
1001,John,Smith,"Information Technology, Support",85000,USA
Visualmente existe una coma dentro del valor:
"Information Technology, Support"
Pero sigue siendo una sola columna CSV.
Herramientas como:
cut -d','
no interpretan las reglas del formato CSV. Simplemente consideran cada coma como un delimitador.
Por lo tanto, pueden devolver resultados incorrectos cuando existen:
- Comas dentro de campos entrecomillados.
- Saltos de línea dentro de campos.
- Comillas escapadas.
- Otras estructuras válidas del estándar CSV.
En esos casos es preferible utilizar una herramienta que realmente interprete CSV, por ejemplo Python:
python3 -c 'import csv,sys; [print(r[4]) for r in csv.reader(sys.stdin)]' < employees.csv
La diferencia conceptual es importante:
cut / awk
│
▼
Procesan texto delimitado
│
▼
CSV sencillo
Python csv
│
▼
Interpreta estructura CSV
│
▼
CSV más complejo
Bonus: obtener la quinta columna de muchos archivos CSV
Supongamos que tenemos:
employees_01.csv
employees_02.csv
employees_03.csv
employees_04.csv
Podemos procesarlos con:
for file in *.csv
do
echo "Processing: $file"
awk -F',' 'NR > 1 {print $5}' "$file"
done
O guardar los resultados:
for file in *.csv
do
awk -F',' 'NR > 1 {print $5}' "$file"
done > all_salaries.txt
Esto demuestra una de las grandes ventajas de Linux:
podemos combinar pequeñas herramientas para construir operaciones mucho más potentes.
Cheat Sheet
Estos son algunos de los comandos más útiles de esta entrada:
# Quinta columna
cut -d',' -f5 employees.csv
# Quinta columna sin encabezado
tail -n +2 employees.csv | cut -d',' -f5
# Utilizando AWK
awk -F',' '{print $5}' employees.csv
# AWK sin encabezado
awk -F',' 'NR > 1 {print $5}' employees.csv
# Valores únicos
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -u
# Ordenar numéricamente
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -n
# Ordenar de mayor a menor
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -nr
# Valor máximo
awk -F',' 'NR > 1 {print $5}' employees.csv | sort -nr | head -1
# Guardar en otro archivo
awk -F',' 'NR > 1 {print $5}' employees.csv > output.txt
Conclusión
Linux ofrece múltiples formas de obtener una columna específica de un archivo CSV.
Para tareas sencillas:
cut -d',' -f5 employees.csv
Para operaciones que requieren filtros y procesamiento adicional:
awk -F',' 'NR > 1 {print $5}' employees.csv
Y para archivos CSV que contienen campos entrecomillados, comas internas u otras estructuras más complejas, es recomendable utilizar un parser CSV real.
Dominar herramientas como cut, awk, sed, sort, head, tail y grep es extremadamente útil para administradores Linux, DBAs, DevOps y equipos de Production Support.
Una de las grandes fortalezas de Unix/Linux no consiste solamente en sus comandos individuales, sino en la posibilidad de combinarlos mediante pipes (|) para transformar grandes cantidades de información utilizando instrucciones muy pequeñas.
