2010-12-08 5 views
4

Je voudrais utiliser awk pour rechercher une valeur dans un fichier texte. Le fichier texte a un format très simple:Utiliser awk pour une recherche de table

texte \ t valeur
texte \ t valeur
texte valeur \ t
...

Je veux passer le texte réel dont la valeur devrait être recherché via une variable shell, par exemple, $ 1.

Des idées comment je peux le faire avec awk?

votre aide est très appréciée.

Tous les meilleurs, Alberto

+0

Notez que si l'onglet est explicitement le séparateur de champ, et si l'un de vos champs peuvent contenir des espaces, vous devrez spécifier onglet comme séparateur de champ: 'awk - F '\ t' ... ' –

Répondre

4

Quelque chose comme ça ferait le travail:

#!/bin/sh 
awk -vLOOKUPVAL=$1 '$1 == LOOKUPVAL { print $2 }' < inputFile 

Essentiellement, vous définissez la valeur de recherche passée dans le script shell dans 1 $ à une variable awk, alors vous pouvez accéder à cela dans awk lui-même. Pour clarifier, le premier $ 1 est l'argument du script shell transmis sur la ligne de commande, le second $ 1 (et les suivants $ 2) sont les champs 1 et 2 du fichier d'entrée.

+0

merci qui fonctionne - sauf pour les changements minimes de la syntaxe: awk '$ 1 == LOOKUPVAL {print $ 2}' LOOKUPVAL = $ 1 inputFile – user534805

+0

Je citerais $ 1 dans le script shell:' awk -v "LOOKUPVAL = $ 1" ... ' –

0
TEXT=`grep value file | cut -f1` 
0

Je pense que grep pourrait en fait être un meilleur ajustement:

$ echo "key value 
ambiguous correct 
wrong ambiguous" | grep '^ambiguous ' | awk ' { print $2 } ' 

Le^sur le motif doit correspondre au début de la ligne et faire en sorte que vous ne correspond pas à une ligne où la valeur, plutôt que la clé, était le texte désiré.

+1

Je ne suis pas d'accord. awk est parfaitement capable de le faire tout seul –

4

Vous pouvez le faire dans un pur script AWK sans emballage shell:

#!/usr/bin/awk -f 
BEGIN { key = ARGV[1]; ARGV[1]="" } 
$1 == key { print $2 } 

Appelez comme ceci:

./lookup.awk keyval lookupfile 

Exemple:

$ cat lookupfile 
aaa  111 
bbb  222 
ccc  333 
ddd  444 
zzz  999 
mmm  888 
$ ./lookup.awk ddd lookupfile 
444 
$ ./lookup.awk zzz lookupfile 
999 

Cela pourrait même être étendu pour sélectionner le champ désiré en utilisant un argument.

#!/usr/bin/awk -f 
BEGIN { key = ARGV[1]; field = ARGV[2]; ARGV[1]=ARGV[2]="" } 
$1 == key { print $field } 

Exemple:

$ cat lookupfile2 
aaa  111  abc 
bbb  222  def 
ccc  333  ghi 
ddd  444  jkl 
zzz  999  mno 
mmm  888  pqr 
$ ./lookupf.awk mmm 1 lookupfile2 
mmm 
$ ./lookupf.awk mmm 2 lookupfile2 
888 
$ ./lookupf.awk mmm 3 lookupfile2 
pqr 
Questions connexes