2010-03-16 3 views
4

У меня есть текстовый файл, который я хочу фильтровать с помощью awk. Текстовый файл выглядит так:Howto Pass String как параметр в AWK в скрипте Bash

foo 1 
bar 2 
bar 0.3 
bar 100 
qux 1033 

Я хочу отфильтровать эти файлы с помощью awk внутри сценария 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 

Но почему-то это не удалось. Каков правильный способ сделать это?

ответ

4

Вам нужны двойные кавычки, чтобы позволить переменную интерполяцию, которая означает, что вам тогда нужно бежать другие знаки доллара с обратными косой чертой так $1 и $2 являются не интерполированным , Также вам нужны двойные кавычки около "$col1type".

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

Спасибо сэр спасибо yoooou :)) ... Вы не знаете, сколько потребовалось, чтобы найти такой ответ ... спасибо сэр снова –

2

Одинарные кавычки тормозят расширение переменного в Баше:

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

передача его в использовании -v вариант awk. Таким образом, вы выделяете переменные awk и переменные оболочки. Его опрятный также без лишних цитат.

#!/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

The «- v 'соответствует POSIX; более старые (System V-ish) версии awk также могут разрешать 'parameter = value' без опции -v. Лучше быть явным - используйте «-v», если в вашей системе не проблема. –

+0

Если вы используете синтаксис bare 'parameter = value' (без префикса' -v'), он должен идти между аргументами '' $ 2> 0 ... ''и' $ input'. Но я сомневаюсь, что там много систем, которые не принимают '-v', и лучше использовать его, когда это возможно. Кроме того, этот метод немного более надежный, чем ответ Джона Кугельмана: что если coltype держал значение 'xyz {next} {print" garbage "}'? – dubiousjim

5

"двойные кавычки одинарные кавычки"

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


пример:

$./a.sh arg1 
arg1 


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


линукс испытания

Смежные вопросы