2010-08-03 6 views
16

J'ai des lignes de données contenant une seule colonne et deux colonnes. Ce que je veux faire est de lignes d'extraction qui contiennent seulement 2 colonnes.Filtrage des lignes en fonction du nombre de colonnes avec AWK

0333 foo 
bar 
23243 qux 

ne cédant que:

0333 foo 
23243 qux 

Notez qu'ils sont séparées par des tabulations, même pour les lignes avec une seule colonne vous avez onglet au début.

Quelle est la façon de le faire?

J'ai essayé mais échouent:

awk '$1!="";{print $1 "\t" $2}' myfile.txt 

enter code here 

Répondre

23

Vous devez utiliser le NF (nombre de champs) variables pour contrôler les actions, comme dans la transcription suivante:

$ echo '0333 foo 
> bar 
> 23243 qux' | awk 'NF==2{print}{}' 
0333 foo 
23243 qux 

Cette volonté imprime la ligne si le nombre de champs est deux, sinon il ne fera rien. La raison pour laquelle j'ai la construction (apparemment) étrange NF==2{print}{} est que certaines implémentations de awk s'imprimeront par défaut si aucune règle n'est trouvée pour une ligne. La commande vide {} garantit que cela n'arrivera pas.

Si vous êtes assez chanceux d'avoir un de ceux qui ne le fait pas, vous pouvez vous en sortir avec:

awk 'NF==2' 

mais la première solution ci-dessus fonctionnera dans les deux cas.

+0

Pourquoi ne pas 'awk 'NF == 2 {print} {} {} {} {} {} {}'' ?? NF == 2 suffit. –

+2

@Mark, certaines implémentations de 'awk' s'imprimeront par défaut si vous ne spécifiez pas d'action par défaut. Mon code fonctionne aussi sur ceux-là. Vous bods sont gâtés avec votre awk GNU, certains d'entre nous doivent écrire du code portable :-) Je vais clarifier. – paxdiablo

+0

@ pax, Une implémentation awk qui se comporte comme vous le décrivez serait assez cassée. Pour autant que je sache, awk date à v7, et le manuel décrit assez clairement son comportement: "par exemple, la longueur du programme> 72 imprime toutes les lignes d'entrée dont la longueur dépasse 72 caractères." –

5
awk '(NF==2){print}' test.txt 
Questions connexes