Supprimer les entrées en double d'un fichier CSV


13

J'ai un fichier [csv] avec des données en double réimprimées, c'est-à-dire les mêmes données imprimées deux fois. Je l' ai essayé d' utiliser le uniq de sorte par sort myfile.csv | uniq -umais il n'y a pas de changement dans le myfile.csv, aussi je l' ai essayé , sudo sort myfile.csv | uniq -umais pas de différence.

Donc, actuellement, mon fichier csv ressemble à ceci

a
a
a
b
b
c
c
c
c
c

Je voudrais y ressembler

a
b
c

sort -u monfichier.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar

selon man sort, vous ne pouvez pas trier "sur place".
Archemar

Vous pouvez également essayer de ne pas compter sur le terminal. Vous pouvez essayer cet outil en ligne à la place textmechanic.com/text-tools/basic-text-tools/…
Aminah Nuraini

Réponses:


16

La raison pour laquelle myfile.csvest ne change pas parce que l' -uoption uniqsera uniquement imprimer des lignes uniques. Dans ce fichier, toutes les lignes sont des doublons et ne seront donc pas imprimées.

Cependant, plus important encore, la sortie ne sera pas enregistrée myfile.csvcar elle uniqsera simplement imprimée sur stdout(par défaut, votre console).

Vous devez faire quelque chose comme ceci:

$ sort -u myfile.csv -o myfile.csv

Les options signifient:

  • -u - ne garder que des lignes uniques
  • -o - sortie dans ce fichier au lieu de stdout

Vous devriez voir man sortpour plus d'informations.


3

Comme l'a montré Belmin, le tri est super. Sa réponse est la meilleure pour les données non triées, et elle est facile à mémoriser et à utiliser.

Cependant, il est également volatil, car il change l'ordre de l'entrée. Si vous devez absolument faire passer les données dans le même ordre mais en supprimant les doublons ultérieurs, awk peut être préférable.

$ cat myfile.csv
c
a
c
b
b
a
c


$ awk '{if (!($0 in x)) {print $0; x[$0]=1} }' myfile.csv
c
a
b

Affaire bizarre, mais elle revient de temps en temps.

De plus, si vos données sont déjà triées lorsque vous les piquez, vous pouvez simplement exécuter uniq.

$ cat myfile.csv 
a
a
a
b
b
c
c
c
c
c


$ uniq myfile.csv 
a
b
c

L'inconvénient de mes deux suggestions est que vous devez utiliser un fichier temporaire et le recopier.


2

uniq -u uniquement imprimer des lignes uniques. Votre saisie n'a pas de lignes uniques, alors uniq -un'imprimez rien. Vous avez seulement besoin de sort:

sort -u myfile.csv

2

Si vous souhaitez conserver l'ordre du fichier (non trié) tout en supprimant les doublons, vous pouvez également le faire

awk '!v[$1]++' /tmp/file

Par exemple

d
d
a
a
b
b
c
c
c
c
c

Il produira

d
a
b
c

Pourriez-vous s'il vous plaît développer la syntaxe?
Sopalajo de Arrierez

Placez la chaîne dans un hachage. Si la chaîne n'existe PAS dans le hachage, imprimez.
NinjaGaiden
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.