2010-08-04 8 views
0

j'ai plusieurs années csv qui ressemblent à ceci:supprimer les doublons par ligne

J'ai plusieurs fichiers texte volumineux (csv de 's) que sur certaines lignes ont des entrées redondantes. Autrement dit, en raison de la façon dont ils ont été fusionnés, un certain champ aura souvent la même valeur deux fois ou trois fois. Cependant, ce n'est pas toujours dans le même ordre.

BWTL, NEWSLETTER, NEWSLETTER
BWTL, NEWSLETTER, R2R, NEWSLETTER
MPWJ, OOTA HOST, HOST OOTA, OOTA HOST
HOST OOTA, ITOS, OOTA HOST

etc. Les entrées qui sont à côté les uns aux autres sont assez faciles à nettoyer avec sed

sed -i « » « s/NEWSLETTER, LETTRE d'INFORMATION/NEWSLETTER/g » * .csv

y at-il un moyen rapide similaire à réparer les autres doublons ?

Répondre

0

Vous pouvez faire quelque chose comme

sed -i "" 's/^\(.*NEWSLETTER.*\), NEWSLETTER/\1/g' eNewsletter.csv_new.csv 

Il fonctionne en capturant tout jusqu'à la deuxième NEWSLETTER ^ signifie début de la ligne \( et \) délimitent la capture et .* indique quoi que ce soit. Il remplace ensuite la chaîne correspondante avec seulement la partie capturée.

+0

qui fonctionne très bien! il me laisse cependant avec des doubles virgules ou des virgules à la fin de la ligne. – alex

+0

Doh! Je vais le réparer – deinst

+0

Ce changement (en ajoutant la virgule) fait en sorte qu'il ne supprime plus les doublons? Ou (après avoir exécuté ma ligne sed) il semble que cela affecte seulement maintenant les doublons qui ne sont pas l'un à côté de l'autre? – alex

0
#!/bin/bash 

awk -F"," ' 
{ 
delete a 
for(i=1;i<=NF;i++){ 
gsub(/^ +| +$/,"",$i) 
if(!($i in a)) { 
    printf "%s,",$i 
    a[$i] 
} 
} 
print "" 
}' file 
0

Essayez:

# Sort before using the uniq command 
sort largefile.csv | sort | uniq -d 

Bien que, ce ne signale que les doublons qui sont à côté de l'autre.

Questions connexes