web-dev-qa-db-fra.com

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

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
31
Zach C

Remplacez simplement votre commande awk par la colonne que vous souhaitez effectuer pour supprimer les lignes dupliquées sur la base (dans votre cas, la troisième colonne):

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

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

Au-dessus de la commande awk fonctionnera si vos colonnes dans le fichier d'entrée sont délimitées par space ou Tab entre elles, si les colonnes sont délimitées par autre chose, vous devez le dire à awk avec son -F option. Ainsi, par exemple, si toutes les colonnes délimitées par une virgule (,) et souhaite supprimer les lignes basées sur la troisième colonne, utilisez -F',' option.

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

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

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

Vous pouvez vous référer à this réponse qui suggère que 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.

18
Ramesh