Supprimer les lignes basées sur les doublons dans une colonne sans trier

30

J'ai de gros fichiers à 3 colonnes (~ 10 000 lignes) et je voudrais supprimer des lignes lorsque le contenu de la troisième colonne de cette ligne apparaît dans la troisième colonne d'une autre ligne. La taille des fichiers rend le tri un peu lourd, et je ne peux pas utiliser quelque chose comme le code ci-dessous car les lignes entières ne sont pas identiques; juste le contenu de la colonne 3.

awk '!seen[$0]++' filename
Zach C
la source

Réponses:

31

Remplacez simplement votre commande awk par la colonne que vous souhaitez effectuer pour supprimer les lignes en double en fonction (dans votre troisième colonne):

awk '!seen[$3]++' filename

Cette commande indique les awklignes à imprimer. La variable $3contient tout le contenu de la colonne 3 et les crochets sont un accès au tableau. Ainsi, pour chaque troisième colonne de ligne dans nom de fichier, le nœud du tableau nommé seenest incrémenté et la ligne imprimée si le contenu de ce nœud (colonne3) n'était pas ( !) précédemment défini.

La awkcommande ci- dessus fonctionnera si vos colonnes dans le fichier d'entrée sont délimitées avec spaceou Tabentre elles-mêmes, si les colonnes délimitées avec autre chose, vous devez lui dire de awk avec son -Foption. Ainsi, par exemple, si toutes les colonnes sont délimitées par une virgule ( ,) et que vous souhaitez supprimer les lignes en fonction de l' -F','option d' utilisation de la troisième colonne .

awk -F',' '!seen[$3]++' filename
αғsнιη
la source
18

sortLa commande est déjà optimisée pour gérer des fichiers volumineux. Donc, vous pourriez très bien utiliser la sortcommande sur votre fichier comme,

sort -u -t' ' -k3,3 file
  • -u - imprimez uniquement les lignes uniques.
  • -t- spécifiez le délimiteur. Ici, dans cet exemple, j'utilise simplement l'espace comme délimiteur.
  • -k3,3 - trier sur le 3ème champ.

Vous pouvez vous référer à cette réponse qui suggère que le tri GNU est en fait la meilleure approche pour trier les gros fichiers. Dans votre cas, je pense que même sans -parallel, vous pourriez obtenir votre résultat final sans trop de retard.

Ramesh
la source
Était sur le point de commenter sarcastique qui -une supprimerait que les lignes en double , pas les clés en double ... mais je me trompe.
Randoms
@Ramesh, il fait le travail, mais le tri change la séquence de lignes que je suppose pas toujours attendue.
Bharat