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…