2010-03-16 5 views
4

J'ai un fichier texte que je veux filtrer en utilisant awk. Le fichier texte ressemble à ceci:Howto Passez une chaîne en tant que paramètre dans AWK de Bash Script

foo 1 
bar 2 
bar 0.3 
bar 100 
qux 1033 

Je veux filtrer ces fichiers avec awk dans un script bash.

#!/bin/bash 

#input file 
input=myfile.txt 

# I need to pass this as parameter 
# cos later I want to make it more general like 
# coltype=$1 
col1type="foo" 

#Filters 
awk '$2>0 && $1==$col1type' $input 

Mais en quelque sorte, il a échoué. Quelle est la bonne façon de le faire?

Répondre

4

Vous avez besoin des guillemets doubles pour permettre l'interpolation de variables, ce qui signifie que vous avez besoin alors d'échapper aux autres signes dollar avec antislashs si $1 et $2 sont pas interpolées . Aussi, vous avez besoin de guillemets autour de "$col1type".

awk "\$2>0 && \$1==\"$col1type\"" 
+0

Merci monsieur merci :) yoooou) ... Vous ne savez pas combien il a fallu trouver une telle réponse ... merci monsieur nouveau –

2

Les guillemets simples qui empêchent l'expansion variable bash:

awk '$2>0 && $1=='"$col1type" 
10

passe en utilisant l'option -v de awk. De cette façon, vous séparez les variables awk et les variables shell. Son plus propre aussi sans devis supplémentaire.

#!/bin/bash 

#input file 
input=myfile.txt 

# I need to pass this as parameter 
# cos later I want to make it more general like 
# coltype=$1 
col1type="foo" 

#Filters 
awk -vcoltype="$col1type" '$2>0 && $1==col1type' $input 
+0

Le « - La notation v 'est conforme à POSIX; les anciennes versions (System V-ish) de awk peuvent aussi permettre 'parameter = value' sans l'option '-v'. Il est préférable d'être explicite - utilisez le '-v' sauf s'il y a un problème avec votre système. –

+0

Si vous utilisez le paramètre 'nu = syntaxe value' (sans le préfixe' -v'), il doit aller entre le ' '$ 2> 0 ...'' et 'les input' $ arguments. Mais je doute qu'il y ait beaucoup de systèmes qui n'acceptent pas '-v', et il est préférable de l'utiliser quand c'est possible. En outre, cette méthode est un peu plus robuste que la réponse de John Kugelman: si la valeur COLTYPE 'a tenu xyz {suivante} {print « ordures »}'? – dubiousjim

5

"guillemet guillemets simples"

awk '{print "'$1'"}' 


exemple:

$./a.sh arg1 
arg1 


$cat a.sh 
echo "test" | awk '{print "'$1'"}' 


linux testé

Questions connexes