2016-08-22 3 views
2

j'ai un fichier qui ressemble àBash - Supprimer les doublons préserver l'ordre

1254543534523233434 
3453453454323233434 
2342342343223233535 
0909909092324243535 

est-il un moyen/commande en bash pour supprimer les doublons sur le fichier ci-dessus, sur la base d'une sous-chaîne spécifique, sans changer leur ordre le résultat?

-à-dire

(avec sous-chaîne -> $ {ligne: 11: 8}

1254543534523233434 
2342342343223233535 
0909909092324243535 

Je sais que:

sort -u : sorts them numerically, then removes duplicates 
sort -kx,x -u : The same 
cat filein | uniq : requires them to be sorted already or it will not work 

J'essaie de savoir s'il y a un natif solution linux sans avoir à résoudre le code perl pour cela.Merci à l'avance

+0

Ce n'est pas une copie exacte. Il a la contrainte supplémentaire de comparer des lignes basées uniquement sur une sous-chaîne, mais en imprimant la ligne complète. Cependant, la [réponse] (http://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in-a-file-in-unix) devrait être facilement extensible à 'awk ' ! seen [substr ($ 0, 11, 8)] ++ 'fichier.txt'. –

Répondre

3

Vous pouvez utiliser awk sans aucune besoin de tri:

awk '!uniq[substr($0, 12, 8)]++' file 

1254543534523233434 
2342342343223233535 
0909909092324243535 
  • Depuis l'indice awk commence à partir 1 vous devez utiliser substr($0, 12, 8) pour obtenir désiré 8 caractères du texte à partir de la 12e position.
  • uniq est un tableau associatif avec sous-chaîne récupérée à l'aide de la fonction substr.
  • ++ valeur ensembles de tableau comme 1
+1

Cela a fonctionné parfaitement, merci. – onlyf