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…