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
3kstc
la source
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.

Belmin Fernandez
la source
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.

Falsenames
la source
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
cuonglm
la source
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
NinjaGaiden
la source
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