2009-12-04 6 views
1

Je contiennent des données comme ceci:problème commande regex awk

# data_display 

ab as we hj kl 
12 34 45 83 21 
45 56 98 45 09 

J'ai besoin que la première colonne seule, et seules les lignes commençant par des chiffres.

J'utilise maintenant:

# data_display | awk '{ print $1 }' | grep "^[0-9]" 

Est-il possible d'optimiser plus, comme l'utilisation de l'expression rationnelle dans awk lui-même?

Je suis très nouveau à awk.

Merci.

KK

Répondre

6

Dans awk, les expressions régulières viennent avant l'instruction d'impression, y compris les accolades. Donc, dans votre cas, l'appel awk serait:

awk '/^[0-9]/ {print $1}' 
0

Bien sûr, vous pouvez:

pax> echo 'ab as we hj kl 
12 34 45 83 21 
45 56 98 45 09' | awk '/^[0-9]/ {print $1}' 

vous donne:

12 
45 

Awk les commandes sont constituées d'un motif réel pour correspondre et une commande à exécuter. S'il n'y a pas de modèle, la commande s'exécute pour toutes les lignes.

2

Vous pouvez placer le regexp grep dans la commande awk directement:

data_display | awk '/^[0-9]/{ print $1 }' 
1

Vous pouvez utiliser cut au lieu de awk:

$ data_display | grep '^[0-9]' | cut -f 1 -d ' ' 
+0

pourquoi utiliser 2 commandes quand 1 le fait déjà ... produisant des frais généraux – ghostdog74

+0

levislevis85, vous devriez toujours tester vos hypothèses. awk est un langage de programmation complet, couper et grep sont des outils plus simples. Avez-vous testé quels frais généraux sont plus élevés? Je ne fais que pointer vers les options. – Svante

+0

Quoi qu'il en soit, je pense que 'cut' entre quand awk ne peut pas utiliser le mécanisme' $ 1'. Ce qui est amusant, c'est que déplacer l'expression rationnelle d'un grep externe dans le script awk ne fait pratiquement aucune différence - de sorte que la surcharge des «commandes additionnelles» semble insignifiante. – Svante

1

Pour plus de précision, vérifiez les nombres réels (au cas où vous auriez des données comme 1a, qui n'est pas un nombre mais qui correspondra à la solution donnée jusqu'ici.
$ awk '$1+0==$1' file 

ou

awk '$1 ~/^[0-9]+$/' file 
+0

bon pour montrer l'opérateur de comparaison regex "~" –

1

cut -d » 'nom de fichier -f1 | grep '^ [0-9]'

cela devrait être le plus rapide. puisque awk regarde et classifie le fichier en tant qu'enregistrements et champs.

Ici, nous minimisons la quantité de données que grep doit traiter en coupant le premier champ.