2010-08-17 9 views
1

donné un fichier texte délimité par des onglets avec deux colonnes « nom » et « date »:partitionné Total courant dans un fichier texte

Sam  20100101 
Sam  20100101 
Sam  20100102 
George 20100101 
George 20100101 
George 20100102 

Puis-je utiliser awk pour ajouter la troisième colonne avec un total de fonctionnement cloisonné, comme début d'un compteur à 0 pour chaque motif distinct de la colonne un et deux, puis incrémentation pour toute répétition du motif?

Sam  20100101  1 
Sam  20100101  2 
Sam  20100102  1 
George 20100101  1 
George 20100101  2 
George 20100102  1 

Je le fais dans SQL: select row_number() sur (partition par la colonne 1, la deuxième colonne ordre par colonne 10) de la table

mais je besoin d'une alternative - pas nécessairement awk, mais cela est venu à l'esprit - pour les fichiers texte non traités par SQL. Les fichiers texte sont ~ 50 Go chacun avec environ 200 mil lignes. J'utilise le compteur pour supprimer les lignes en double. Je suis conscient que donné mon exemple ci-dessus, cela peut être fait avec:

trier monfichier.txt | mais mes fichiers texte ont des colonnes supplémentaires non incluses dans mon exemple (par souci de brièveté) qui peuvent ne pas produire une ligne entièrement dupliquée.

Dois-je ajouter un paramètre pour correspondre uniquement les colonnes de nom et la date dans le

sorte myfile.txt | uniq -u

commande? Awk? Autre chose?

Répondre

3

Si toutes les lignes ont une structure identique (y compris des espaces), quelque chose d'aussi simple que cela fera l'affaire:

awk '{print $0, ++a[$0]}' 

Je ne suis pas sûr de la performance sur les fichiers de taille GB, car cela devra stocker un nombre par rangée unique. Si vos données sont triées vous pouvez obtenir une quantité forfaitaire de stockage:

awk '{ if ($0 != prev) n = 0; print $0, ++n; prev = $0 }' 
+0

Merci pour votre aide! Toutes les lignes n'ont pas le même formatage. Puis-je passer le ++ a [$ 0] à quelque chose qui ne correspondra que sur les deux premières colonnes? ++ a [$ 1 $ 2]? –

+0

@M. Roessler Oui, cela fonctionnera bien. – schot

Questions connexes