J'ai un long fichier CSV avec deux colonnes, qui comprend des séries de doublons consécutifs comme celui-ci :
...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...
Je dois supprimer tous ces doublons à l'exception du dernier. Le résultat de l'exemple ci-dessus serait :
...
1500,1533
1554,1728
1593,1766
...
De plus, je dois conserver le reste des lignes du fichier dans leur ordre d'origine.
J'ai essayé tac file.csv | sort -k1,1 -r -u -t,
mais cela n'a pas donné le résultat souhaité et les fonctions basées sur le tri ont gâché mon ordre de ligne.
Réponse acceptée :
Avec sed
:
sed '$!N;/\(.*,\).*\n\1/!P;D' infile
N
signifie qu'il y a toujours deux lignes consécutives dans l'espace du motif et sed
P
imprime le premier d'entre eux uniquement si le premier champ de cette ligne n'est pas le même que le premier champ de la deuxième ligne. Alors D
supprime la première ligne de l'espace du motif et redémarre le cycle.
Une autre façon avec gnu datamash
(en supposant que votre fichier est trié en tant que datamash
nécessite une entrée triée) :
datamash -t ',' -g 1 last 2 <infile
Ce g
regroupe les ,
entrée délimitée par 1
er champ, n'imprimant que le last
valeur (de 2
ème colonne) de chaque groupe.
Si votre fichier n'est pas trié datamash
peut le trier via -s
:
datamash -t ',' -s -g 1 last 2 <infile
mais cela signifie que l'ordre initial des lignes ne sera pas conservé. Donc, cela pourrait ne pas faire ce que vous voulez. Dans ce cas, vous pouvez utiliser sed
/awk
/perl
etc…