Cómo obtener los valores de la quinta columna de un archivo CSV usando comandos Linux

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ónColumna
1employee_id
2first_name
3last_name
4department
5salary
6country

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étodoComandoVentaja
cutcut -d',' -f5Muy sencillo
tail + cuttail -n +2 | cut -d',' -f5Elimina encabezado
awkawk -F',' '{print $5}'Flexible
awk + NRawk -F',' 'NR > 1 {print $5}'Flexible y elimina header
sedExpresión regularDisponible en casi todo Unix/Linux
Perlperl -F',' ...Potente para scripting
Python csvcsv.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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *