GNU/Linux >> Tutoriels Linux >  >> Linux

Supprimer des lignes consécutives dans Csv avec des valeurs en double dans un champ, mais conserver la dernière ligne ?

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…


Linux
  1. Comment boucler sur les lignes d'un fichier ?

  2. Conserver uniquement la première ligne de chaque séquence de lignes consécutives correspondant à un motif ?

  3. Supprimer les anciens fichiers journaux à l'exception du dernier (trié par ordre alphanumérique) ?

  4. Trier mais garder la ligne d'en-tête en haut ?

  5. Comment utiliser sed pour supprimer les n dernières lignes d'un fichier

Imprimer la dernière ligne d'un fichier, à partir de la CLI

Tri sur le dernier champ d'une ligne

Supprimez les cinq premiers caractères de n'importe quelle ligne d'un fichier texte sous Linux avec sed

Linux - grep de certaines lignes à la fin du fichier

Lignes Grep commençant par 1, mais pas 10, 11, 100, etc.

remplacer les lignes d'un fichier par les lignes d'un autre par numéro de ligne