GNU/Linux >> Tutoriales Linux >  >> Linux

¿Eliminar líneas consecutivas en Csv con valores duplicados en un campo, pero conservar la última línea?

Tengo un archivo CSV largo con dos columnas, que incluye series de duplicados consecutivos como este:

...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...

Necesito eliminar todos estos duplicados excepto el último, por lo que el resultado del ejemplo anterior sería:

...
1500,1533
1554,1728
1593,1766
...

También necesito mantener el resto de las líneas en el archivo en su orden original.

Intenté tac file.csv | sort -k1,1 -r -u -t,

pero esto no dio el resultado deseado, y las funciones basadas en orden desordenaron mi orden de línea.

Respuesta aceptada:

Con sed :

sed '$!N;/\(.*,\).*\n\1/!P;D' infile

N significa que siempre hay dos líneas consecutivas en el espacio del patrón y sed P imprime el primero de ellos solo si el primer campo de esa línea no es el mismo que el primer campo de la segunda línea. Entonces D elimina la primera línea del espacio del patrón y reinicia el ciclo.

Otra forma con gnu datamash (suponiendo que su archivo esté ordenado como datamash requiere entrada ordenada):

datamash -t ',' -g 1 last 2 <infile

Este g agrupa el , entrada delimitada por 1 st campo, imprimiendo solo el last valor (de 2 segunda columna) de cada grupo.

Si su archivo no está ordenado datamash puede ordenarlo a través de -s :

datamash -t ',' -s -g 1 last 2 <infile

pero eso significa que no se conservará el orden inicial de las líneas. Así que esto podría no hacer lo que quieres. En ese caso podrías usar sed /awk /perl etc…


Linux
  1. Copie y pegue en la línea de comandos de Linux con xclip

  2. ¿Cómo recorrer las líneas de un archivo?

  3. ¿Encontrar la edad del archivo más antiguo en una línea o devolver cero?

  4. Ordenar en el último campo de una línea

  5. Elimine los primeros cinco caracteres en cualquier línea de un archivo de texto en Linux con sed

¿Ordenar pero mantener la línea de encabezado en la parte superior?

¿Duplicar, con unos pequeños cambios, unas pocas líneas en un archivo de texto?

Imprimir la última línea de un archivo, desde la CLI

Cómo usar sed para eliminar las últimas n líneas de un archivo

¿Qué tiene de malo mi secuencia de comandos bash para mantener los últimos archivos x y eliminar el resto?

Grep líneas que comienzan con 1, pero no 10, 11, 100, etc.