← Terminal y Línea de Comandos en Linux Bloque 6 · Filtrar y transformar texto · Tema 26 de 43

Tema 26

Los filtros básicos

En el bloque anterior aprendimos a conectar comandos; ahora estudiamos las piezas que se conectan. Este tema reúne seis filtros pequeños, cada uno con una sola habilidad: ordenar, quitar repetidos, recortar columnas, cambiar caracteres, pegar líneas, numerar. Ninguno impresiona por separado. Combinados, responden preguntas sobre un archivo de datos que de otro modo pedirían una planilla de cálculo o un programa. Los practicamos sobre un pequeño registro de ventas, que nos acompañará durante todo el bloque.

1. Líneas, campos y una caja de herramientas

Los filtros de este bloque ven el texto de una manera precisa. Un archivo es una sucesión de líneas, como definimos en el tema 12. Y muchas veces cada línea está dividida en campos por un carácter separador: una coma, dos puntos, una tabulación.

Una línea de un archivo de datos dividida en seis campos por comas: la fecha, el vendedor, la ciudad, el producto, la cantidad y el importe 2026-10-01 1 fecha Luis 2 vendedor Rosario 3 ciudad teclado 4 producto 2 5 cantidad 90 6 importe
La línea 2026-10-01,Luis,Rosario,teclado,2,90 vista como seis campos. Los campos se numeran desde 1.

Con esa mirada, un archivo de texto es una tabla: las líneas son filas y los campos son columnas. Los seis filtros del tema operan sobre una de las dos dimensiones:

FiltroHaceTrabaja sobre
sortOrdena las líneas.Filas
uniqFunde las líneas repetidas contiguas, y las cuenta.Filas
cutDeja pasar solo ciertos campos, o ciertas posiciones.Columnas
trReemplaza o borra caracteres.Caracteres
pasteUne líneas de varios archivos, lado a lado.Columnas
nlNumera las líneas.Filas

Todos cumplen el contrato del tema 22: leen de un archivo dado como argumento o, si no lo hay, de su entrada; escriben en su salida; y no modifican el archivo original. El resultado va a la pantalla, a una tubería o adonde se lo redirija.

2. Los datos de trabajo

Creamos el archivo con un documento en línea, como aprendimos en el tema 23. Es un registro de diez ventas, sin fila de títulos, con los campos separados por comas: el formato que se conoce como CSV, de comma-separated values.

terminal
$ cd ~/practica
$ cat > ventas.csv << FIN
> 2026-10-01,Luis,Rosario,teclado,2,90
> 2026-10-01,Marta,Mendoza,monitor,1,320
> 2026-10-02,Ana,Salta,mouse,5,75
> 2026-10-02,Luis,Rosario,cable,10,40
> 2026-10-03,Marta,Rosario,teclado,1,45
> 2026-10-03,Ana,Mendoza,monitor,2,640
> 2026-10-05,Luis,Salta,mouse,3,45
> 2026-10-05,Ana,Rosario,cable,4,16
> 2026-10-06,Marta,Mendoza,mouse,2,30
> 2026-10-06,Luis,Rosario,monitor,1,320
> FIN
$ wc ventas.csv
 10  10 360 ventas.csv
CampoContenidoValores
1FechaEn formato año-mes-día.
2VendedorAna, Luis, Marta.
3CiudadMendoza, Rosario, Salta.
4Productocable, monitor, mouse, teclado.
5CantidadUnidades vendidas.
6ImporteEl total de la venta.

Si wc no responde diez líneas y 360 bytes, hay una diferencia de tipeo; conviene corregirla con nano, porque los resultados del resto del bloque dependen de estos datos. El archivo queda en el directorio de práctica.

3. sort: ordenar líneas

sort escribe las líneas de su entrada en orden. Lo usamos varias veces; ahora miramos con cuidado cómo ordena, porque de eso dependen sus sorpresas:

terminal
$ sort tareas.txt
Comprar pan
Estudiar vim
Llamar a Luis
Pagar la luz
Regar las plantas
$ sort -r tareas.txt | head -n 2     # -r: en orden inverso
Regar las plantas
Pagar la luz

Por defecto, sort compara las líneas completas, carácter por carácter, de izquierda a derecha, según el orden alfabético del idioma configurado en el sistema. Esa última parte tiene consecuencias:

Con el sistema en español…Ejemplo
Mayúsculas y minúsculas se mezclan.ana, Bruno, carla.
Las letras acentuadas y la ñ van en su lugar.ñandú entre nube y oso.
Los signos de puntuación casi no cuentan..bashrc cerca de la «b», como vimos con ls.

Es el mismo criterio que usa ls, y el adecuado para textos. Cuando se necesita un orden estricto por el código de cada carácter —mayúsculas antes que minúsculas, y siempre igual en cualquier máquina— se antepone una variable al comando: LC_ALL=C sort archivo. Es lo recomendable en los scripts, donde el resultado no debe depender de cómo esté configurado cada equipo.

4. Ordenar números

Comparar carácter por carácter funciona con palabras y falla con números. Lo vemos con la columna de importes, extraída con cut, que estudiamos en la sección 8:

terminal
$ cut -d, -f6 ventas.csv | sort | paste -s -d' '
16 30 320 320 40 45 45 640 75 90
$ cut -d, -f6 ventas.csv | sort -n | paste -s -d' '
16 30 40 45 45 75 90 320 320 640

El paste final solo junta los resultados en un renglón, para verlos mejor. En la primera salida, 320 quedó antes que 40: comparados como texto, el carácter «3» es anterior al «4», y ahí termina la comparación. Es el orden de un diccionario, donde «casa» va antes que «cesto» sin importar el largo. La opción -n hace que las líneas se interpreten como números.

OpciónCompara comoPara
NingunaTextoPalabras, nombres.
-nNúmerosCantidades, importes, tamaños en bytes.
-hNúmeros con sufijo: 2K, 1,5M, 3GLa salida de du -h y ls -lh.
-VNúmeros de versión1.9 antes que 1.10; foto2 antes que foto10.
-MNombres de mesene, feb, mar…

Las fechas de nuestro archivo no necesitan ninguna opción. Escritas como año, mes y día, con ceros a la izquierda, su orden alfabético coincide con el cronológico. Es la razón por la que ese formato se prefiere en nombres de archivos y en registros, como anticipamos en el tema 15.

5. Ordenar por una columna

Lo habitual en un archivo de datos es ordenar por un campo determinado. Hacen falta dos opciones: -t para decir cuál es el separador, y -k, de key, para decir qué campo es la clave.

anatomía de una ordenación por columna
sort -t, -k6,6n ventas.csv
     │   │  │ │
     │   │  │ └─ comparar ese campo como número
     │   │  └─ …y termina en el campo 6
     │   └─ la clave empieza en el campo 6…
     └─ el separador de campos es la coma
terminal: las ventas, de menor a mayor importe
$ sort -t, -k6,6n ventas.csv
2026-10-05,Ana,Rosario,cable,4,16
2026-10-06,Marta,Mendoza,mouse,2,30
2026-10-02,Luis,Rosario,cable,10,40
2026-10-03,Marta,Rosario,teclado,1,45
2026-10-05,Luis,Salta,mouse,3,45
2026-10-02,Ana,Salta,mouse,5,75
2026-10-01,Luis,Rosario,teclado,2,90
2026-10-01,Marta,Mendoza,monitor,1,320
2026-10-06,Luis,Rosario,monitor,1,320
2026-10-03,Ana,Mendoza,monitor,2,640

Las líneas se movieron enteras: sort usa el campo para decidir el orden, y conserva la fila completa.

La forma -k6,6, con el número repetido, es deliberada. La clave se indica como «desde el campo tal hasta el campo cual», y -k6 a secas significa «desde el campo 6 hasta el final de la línea». En la última columna da lo mismo; en cualquier otra, la clave arrastraría los campos siguientes, y el resultado no sería el esperado. Escribir siempre inicio y fin evita el problema.

Sin -t, el separador son los espacios

Si no se indica -t, sort considera que los campos están separados por espacios o tabulaciones. En un archivo CSV, eso hace que toda la línea sea un único campo, y -k no tiene efecto. Es el olvido más frecuente.

6. sort: varias claves y otras opciones

La opción -k se puede repetir. La primera clave manda; la segunda desempata entre las líneas que la primera considera iguales. Cada clave puede llevar sus propias letras: n para numérica, r para inversa.

terminal: por ciudad, y dentro de cada ciudad, de mayor a menor importe
$ sort -t, -k3,3 -k6,6nr ventas.csv
2026-10-03,Ana,Mendoza,monitor,2,640
2026-10-01,Marta,Mendoza,monitor,1,320
2026-10-06,Marta,Mendoza,mouse,2,30
2026-10-06,Luis,Rosario,monitor,1,320
2026-10-01,Luis,Rosario,teclado,2,90
2026-10-03,Marta,Rosario,teclado,1,45
2026-10-02,Luis,Rosario,cable,10,40
2026-10-05,Ana,Rosario,cable,4,16
2026-10-02,Ana,Salta,mouse,5,75
2026-10-05,Luis,Salta,mouse,3,45

Es el equivalente de «ordenar por ciudad, luego por importe descendente» de una planilla. Las demás opciones útiles:

OpciónEfecto
-rInvierte el orden.
-uElimina las líneas repetidas: deja una de cada una.
-fNo distingue mayúsculas de minúsculas.
-bIgnora los espacios iniciales de cada campo.
-o archivoEscribe el resultado en ese archivo, que puede ser el mismo de entrada.
-cNo ordena: comprueba si ya está ordenado, y lo dice con el código de salida.

-o es la respuesta a la trampa del tema 23. sort archivo > archivo vaciaba el archivo; sort -o archivo archivo lo ordena en su lugar, porque sort lee todo antes de abrir la salida.

7. uniq: los repetidos

uniq elimina líneas repetidas. Tiene una particularidad que hay que aprender junto con su nombre:

uniq compara cada línea solo con la anterior. Funde las repetidas cuando están contiguas; dos líneas iguales separadas por otra distinta no las detecta.

La consecuencia se ve con la columna de vendedores, donde los nombres se repiten pero nunca en líneas seguidas:

terminal
$ cut -d, -f2 ventas.csv | uniq | paste -s -d' '          # sin ordenar: no quita nada
Luis Marta Ana Luis Marta Ana Luis Ana Marta Luis
$ cut -d, -f2 ventas.csv | sort | uniq | paste -s -d' '   # ordenando antes
Ana Luis Marta

Por eso uniq va casi siempre precedido de sort, que junta las iguales. No es un defecto: comparar solo con la anterior le permite trabajar sobre archivos enormes sin guardar nada en memoria. Y es coherente con la idea de que cada herramienta hace una sola cosa; ordenar es trabajo de otra.

OpciónMuestra
NingunaUna línea por cada grupo de repetidas.
-cLo mismo, con la cantidad delante.
-dSolo las que están repetidas: aparecen más de una vez.
-uSolo las que no se repiten: aparecen una sola vez.
-iSin distinguir mayúsculas de minúsculas.
terminal: ¿cuántas ventas hizo cada vendedor?
$ cut -d, -f2 ventas.csv | sort | uniq -c
      3 Ana
      4 Luis
      3 Marta
$ cut -d, -f2 ventas.csv | sort | uniq -c | sort -rn
      4 Luis
      3 Marta
      3 Ana

Es el modismo del tema 24, ahora con cada pieza entendida. El primer sort agrupa, uniq -c cuenta, y el segundo sort, numérico e inverso, pone arriba al más frecuente.

Las opciones -d y -u responden preguntas de otra clase. Tomando dos campos a la vez, el vendedor y la ciudad:

terminal
$ cut -d, -f2,3 ventas.csv | sort | uniq -d       # ¿quién vendió más de una vez en la misma ciudad?
Luis,Rosario
Marta,Mendoza

Para simplemente quitar duplicados, sort -u hace en un paso lo mismo que sort | uniq. La pareja sigue siendo necesaria cuando se quiere contar.

8. cut: recortar columnas

cut deja pasar una parte de cada línea y descarta el resto. La parte se puede indicar por campos o por posiciones de caracteres:

anatomía de cut por campos
cut -d, -f2,4 ventas.csv
    │   │
    │   └─ qué campos dejar: el 2 y el 4
    └─ el delimitador es la coma
terminal
$ cut -d, -f2,4 ventas.csv | head -n 3
Luis,teclado
Marta,monitor
Ana,mouse
$ cut -c1-10 ventas.csv | head -n 3               # los caracteres del 1 al 10
2026-10-01
2026-10-01
2026-10-02
SelecciónSignifica
-f3El campo 3.
-f2,4Los campos 2 y 4.
-f2-4Del 2 al 4.
-f3-Del 3 hasta el último.
-f-2Del primero al 2.
-c1-10Los caracteres del 1 al 10. Las mismas formas valen para -c.
--complementLo contrario: todo menos lo indicado.

Con cut se pueden encadenar cortes sucesivos, cambiando de delimitador. Para obtener solo el día de cada fecha, primero se corta por la coma y después por el guion:

terminal
$ cut -d, -f1 ventas.csv | cut -d- -f3 | uniq -c
      2 01
      2 02
      2 03
      2 05
      2 06

Aquí uniq funcionó sin sort, porque el archivo ya está ordenado por fecha y los días iguales son contiguos.

cut es simple, y tiene tres límites que conviene conocer para no pelear con él:

LímiteConsecuencia
El delimitador es un solo carácter, y cada aparición cuenta.Con columnas alineadas con varios espacios, como las de ls -l, cada espacio de más crea un campo vacío.
No cambia el orden de los campos.-f4,2 da lo mismo que -f2,4.
No entiende comillas.En un CSV donde un campo contiene una coma entre comillas, corta mal.

Sin -d, el delimitador es la tabulación. Y las líneas que no contienen el delimitador pasan enteras, salvo que se agregue la opción -s.

9. tr: cambiar y borrar caracteres

tr, de translate, trabaja al nivel más bajo: el carácter. Recibe dos conjuntos y reemplaza cada carácter del primero por el que ocupa la misma posición en el segundo. Lo presentamos en el tema 23 como ejemplo de comando que solo lee de su entrada: no acepta nombres de archivo.

terminal
$ cut -d, -f2 ventas.csv | head -n 3 | tr 'a-z' 'A-Z'   # minúsculas por mayúsculas
LUIS
MARTA
ANA
$ head -n 2 ventas.csv | tr ',' ';'                     # un separador por otro
2026-10-01;Luis;Rosario;teclado;2;90
2026-10-01;Marta;Mendoza;monitor;1;320
$ head -n 1 ventas.csv | tr -d '-'                      # -d: borrar
20261001,Luis,Rosario,teclado,2,90
FormaEfectoEjemplo
tr 'abc' 'xyz'Reemplaza a por x, b por y, c por z.tr ',' '\t': comas por tabulaciones.
tr -d 'abc'Borra esos caracteres.tr -d '\r': quita los finales de línea de Windows.
tr -s 'a'Comprime las repeticiones seguidas en una sola.tr -s ' ': varios espacios, uno.
tr -c 'abc' 'x'Actúa sobre el complemento: todo lo que no está en el conjunto.tr -cd '0-9\n': deja solo dígitos.

Los conjuntos admiten rangos, las clases del tema 9 —[:upper:], [:digit:], [:space:]— y los escapes \n para el salto de línea y \t para la tabulación. Se escriben entre comillas simples, para que la shell no los toque. Las clases son la forma segura de cambiar de caja un texto en español: tr '[:lower:]' '[:upper:]' tiene en cuenta el idioma, mientras que a-z deja sin tocar la ñ y las vocales con tilde.

La opción -s, de squeeze, resuelve el primer límite de cut. Comprimiendo los espacios repetidos, una salida alineada se convierte en campos que cut puede separar:

terminal: tamaño y nombre, a partir de ls -l
$ ls -l | tail -n +2 | tr -s ' ' | cut -d' ' -f5,9
4096 fotos
12813 informe.txt
18 notas.txt
70 tareas.txt
360 ventas.csv

Cuatro filtros: tail quita la línea del total, tr normaliza los espacios, y cut toma los campos quinto y noveno. Funciona mientras los nombres no tengan espacios; es una receta para mirar, no para un script.

10. paste: pegar líneas

paste es el inverso de cut: donde aquel separa columnas, este las junta. Tiene dos usos distintos.

El primero une varios archivos lado a lado: la primera línea de uno con la primera del otro, la segunda con la segunda, y así. Por defecto las separa con una tabulación; -d elige otro carácter.

terminal
$ cut -d, -f2 ventas.csv > /tmp/vendedores.txt
$ cut -d, -f6 ventas.csv > /tmp/importes.txt
$ paste -d: /tmp/importes.txt /tmp/vendedores.txt | head -n 3
90:Luis
320:Marta
75:Ana

Es la manera de reordenar columnas, cosa que cut no sabe hacer: se las separa, y se las vuelve a pegar en el orden deseado.

El segundo uso, con -s, de serial, une todas las líneas de una entrada en una sola. Lo empleamos en este tema para mostrar listas en un renglón, y sirve para convertir una columna en una lista separada por comas:

terminal
$ cut -d, -f3 ventas.csv | sort -u | paste -s -d,
Mendoza,Rosario,Salta
$ cut -d, -f6 ventas.csv | paste -s -d+
90+320+75+40+45+640+45+16+30+320
$ cut -d, -f6 ventas.csv | paste -s -d+ | bc
1621

La última línea es un truco clásico. Ninguno de estos filtros sabe sumar. Pero uniendo los importes con signos más se obtiene una expresión aritmética, y bc, una calculadora que lee su entrada, la resuelve: el total de las ventas es 1621. En el tema 30 veremos una herramienta que suma columnas directamente.

11. nl y column: presentar

Dos filtros menores no transforman los datos, sino su aspecto. nl, de number lines, antepone a cada línea su número, y es útil para poder referirse a ellas:

terminal
$ sort -t, -k6,6nr ventas.csv | head -n 3 | nl
     1  2026-10-03,Ana,Mendoza,monitor,2,640
     2  2026-10-06,Luis,Rosario,monitor,1,320
     3  2026-10-01,Marta,Mendoza,monitor,1,320

Puesto al final de una ordenación, convierte la lista en una clasificación: las tres ventas de mayor importe, con su puesto. A diferencia de cat -n, nl no numera las líneas vacías, y tiene opciones para el ancho y el separador del número.

column alinea los campos en columnas parejas, para que una persona pueda leer una tabla:

terminal
$ column -t -s, ventas.csv | head -n 4
2026-10-01  Luis   Rosario  teclado  2   90
2026-10-01  Marta  Mendoza  monitor  1   320
2026-10-02  Ana    Salta    mouse    5   75
2026-10-02  Luis   Rosario  cable    10  40

La opción -t pide formato de tabla y -s indica el separador de la entrada. Es un filtro de salida: se lo pone al final de una tubería, cuando el resultado es para mirar. Los datos alineados son más difíciles de procesar que los separados por comas, de modo que no conviene alinearlos antes de tiempo.

12. Preguntas a un archivo

Con las seis piezas, más head, tail y wc del tema 12, se puede interrogar al archivo de ventas. Lo importante no es recordar estas líneas sino el modo de armarlas: elegir las columnas que intervienen, y aplicar la operación.

PreguntaTuberíaRespuesta
¿Cuántas ventas hay?wc -l < ventas.csv10
¿En qué ciudades se vendió?cut -d, -f3 ventas.csv | sort -uMendoza, Rosario, Salta
¿Cuántas ciudades son?cut -d, -f3 ventas.csv | sort -u | wc -l3
¿Cuál fue la venta más grande?sort -t, -k6,6nr ventas.csv | head -n 1La de Ana en Mendoza, 640
¿Y la más chica?sort -t, -k6,6n ventas.csv | head -n 1La de Ana en Rosario, 16
¿Cuál fue la última venta?tail -n 1 ventas.csvLa de Luis, el día 6
¿Cuánto se vendió en total?cut -d, -f6 ventas.csv | paste -s -d+ | bc1621
terminal: ¿qué producto se vendió más veces? ¿y en qué ciudad hubo más ventas?
$ cut -d, -f4 ventas.csv | sort | uniq -c | sort -rn
      3 mouse
      3 monitor
      2 teclado
      2 cable
$ cut -d, -f3 ventas.csv | sort | uniq -c | sort -rn | head -n 1
      5 Rosario

Las dos tuberías son la misma, con otro número de campo. Es lo que da valor al modismo: una vez armado, sirve para cualquier columna de cualquier archivo.

Conviene notar lo que estas respuestas cuentan. uniq -c cuenta líneas: «tres ventas de mouse». No suma las cantidades de la quinta columna, que darían diez unidades. Para eso hace falta operar con el contenido de los campos, y es el límite de estos filtros.

13. Hasta dónde llegan

Los filtros básicos ordenan, cuentan y recortan. Hay tres clases de tarea que no pueden hacer, y cada una es el tema de una herramienta del bloque:

Necesito…EjemploHerramientaTema
Seleccionar filas por su contenido.Solo las ventas de Rosario.grep27, 28
Modificar el texto de las líneas.Cambiar «Rosario» por «ROS» en todo el archivo.sed29
Calcular con los campos.El importe total por vendedor.awk30
Comparar dos archivos.Qué ventas hay en un archivo y no en otro.diff, comm31

No por eso quedan obsoletos. En una tubería real conviven todos: grep elige las filas, cut las columnas, sort y uniq resumen. Y para lo que saben hacer, estos son los más rápidos y los más fáciles de leer.

La referencia del tema:

ComandoQué hace
sort archivoOrdena las líneas alfabéticamente.
sort -n, -r, -uNumérico; inverso; sin repetidos.
sort -t, -k3,3Ordena por el tercer campo, separado por comas.
sort -t, -k3,3 -k6,6nrPor el tercero, y luego por el sexto, numérico y descendente.
uniqFunde las líneas iguales contiguas.
uniq -c, -d, -uCuenta; solo las repetidas; solo las únicas.
cut -d, -f2,4Deja los campos 2 y 4.
cut -c1-10Deja los caracteres del 1 al 10.
tr 'a-z' 'A-Z'Reemplaza caracteres.
tr -d, tr -sBorra; comprime repeticiones.
paste a bUne dos archivos línea a línea.
paste -s -d,Une todas las líneas en una, separadas por comas.
nlNumera las líneas.
column -t -s,Alinea los campos en una tabla.

El directorio de práctica tiene desde ahora un archivo más, ventas.csv, que usaremos en los temas siguientes. Empezamos por lo primero que falta: seleccionar líneas. En el tema 27, grep.

14. Resumen

15. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Modifica sort archivo el archivo?

No. Escribe el resultado en su salida. Para guardarlo se redirige a otro archivo, o se usa sort -o.

2. ¿Por qué sort coloca 100 antes que 20?

Porque por defecto compara como texto, carácter por carácter, y «1» es anterior a «2». Con -n los compara como números.

3. ¿Qué opción ordena correctamente la salida de du -h?

-h, que entiende los sufijos K, M y G.

4. ¿Qué hace cada parte de sort -t: -k3,3n /etc/passwd?

-t: fija los dos puntos como separador; -k3,3 usa el tercer campo como clave; la n lo compara como número. Ordena los usuarios por UID.

5. ¿Qué diferencia hay entre -k2 y -k2,2?

-k2 toma como clave desde el campo 2 hasta el final de la línea. -k2,2, solamente el campo 2.

6. Escribe el comando para ordenar ventas.csv por vendedor y, dentro de cada vendedor, por importe descendente.

sort -t, -k2,2 -k6,6nr ventas.csv

7. ¿Por qué uniq se usa casi siempre después de sort?

Porque solo compara cada línea con la anterior. Las repetidas que no están juntas no las detecta, y sort las junta.

8. ¿Qué diferencia hay entre uniq, uniq -c, uniq -d y uniq -u?

Sin opciones deja una línea de cada grupo; -c agrega la cantidad; -d muestra solo las que aparecen más de una vez; -u, solo las que aparecen una vez.

9. ¿Qué muestra cut -d: -f1,7 /etc/passwd?

El nombre de cada usuario y su shell, separados por dos puntos.

10. ¿Por qué cut -d' ' -f5 no sirve directamente sobre la salida de ls -l?

Porque las columnas están alineadas con varios espacios, y para cut cada espacio delimita un campo. Hay que comprimirlos antes con tr -s ' '.

11. ¿Qué hacen tr -d y tr -s?

-d borra los caracteres indicados. -s reduce a uno solo las repeticiones seguidas de un carácter.

12. ¿Por qué falla tr 'a-z' 'A-Z' archivo.txt?

Porque tr no acepta nombres de archivo: solo lee de su entrada. Se escribe tr 'a-z' 'A-Z' < archivo.txt.

13. ¿Qué hace paste -s -d,?

Une todas las líneas de su entrada en una sola, separadas por comas.

14. ¿Cómo se obtiene, de ventas.csv, cuántas ventas hubo en cada ciudad?

cut -d, -f3 ventas.csv | sort | uniq -c

15. uniq -c dice «3 mouse». ¿Significa que se vendieron tres unidades?

No. Significa que hay tres líneas, tres ventas, de ese producto. Sumar las unidades requiere operar con el quinto campo, cosa que estos filtros no hacen.

Para practicar

  1. Ordena ventas.csv por producto y, dentro de cada producto, por cantidad de mayor a menor. Muestra el resultado con column -t -s,.
  2. Averigua cuántos productos distintos se vendieron, y lístalos en un solo renglón separados por una barra.
  3. ¿Cuántas ventas hizo cada vendedor en Rosario? Usa grep Rosario como primer eslabón.
  4. Muestra las tres ventas con más unidades, numeradas con nl.
  5. Obtén el total de unidades vendidas con cut, paste y bc.
  6. Lista los usuarios de /etc/passwd ordenados por UID, mostrando solo el nombre y el UID. ¿Cuál es el mayor?
  7. Con tr, convierte ventas.csv a mayúsculas, y luego a un archivo separado por tabulaciones en /tmp. Revísalo con cat -A.
  8. Con cut y paste, arma en /tmp una versión de ventas.csv con las columnas en este orden: producto, cantidad, vendedor.
  9. Ejecuta ls -l /etc | tail -n +2 | tr -s ' ' | cut -d' ' -f3 | sort | uniq -c y explica qué responde.
  10. Con sort -c, comprueba si ventas.csv está ordenado por líneas completas y si lo está por fecha (-t, -k1,1). Mira el código de salida en cada caso.