2014-01-02 4 views
2

Я новичок в awk и нужна помощьИспользование переменной оболочки в AWK

это работает

awk '{ 
for(i =0;i<10;i++){ 
if ($27 == 'addr1') { 
    print >"temp.csv" 
    } 
    } 
}' /tmp/input.csv 

я пытался ниже и не работает, как передать значение счетчика снаружи команды AWK

count=10 
echo $count 
awk '{ 
for(i =0;i<count;i++){ 
if ($27 == 'addr1') { 
    print >"temp.csv" 
    } 
    } 
}' /tmp/input.csv 
+0

Возможный дубликат [Можем ли мы использовать переменные оболочки в awk?] (Http://stackoverflow.com/questions/15786777/can-we-use-shell-variables-in-awk) – tripleee

+0

Что вы пытаетесь достичь ? Вы хотите напечатать строку 10 раз для нового файла, если поле № 27 равно «addr1»?? –

ответ

5

Используйте опцию -v установить переменную внутри awk:

awk -v count="$count" '...' 

Аргументы «Имя файла» формы X=Y также интерпретируются как назначения переменных. Следующие должны работать:

awk '...' count="$count" /tmp/input.csv 
1

Вы используете -v аргумент AWK, чтобы передать значения от внешней, как AWK переменных.

count=2 
echo $count 
awk -vcount=$count '{ 
for(i =0;i<count;i++){ 
if ($27 == 'addr1') { 
    print >"temp.csv" 
    } 
    } 
}' /tmp/input.csv 
2

Если вы хотите сравнить с строкой внутри awk, вам нужны двойные кавычки вокруг строки. Как

awk -v count=$count ' 
$27=="addr1" { 
    for(i=0;i<count;i++) 
    print > "temp.csv" 
}' /tmp/input.csv 

(Обратите внимание, что, например 'if ($27 == 'addr1')' будет расширяться 'if ($27 == addr1)', то есть: addr1 без двойных кавычек)

Если же вы хотите сравнить с переменной оболочки $addr1 внутри AWK, вы можете сделать

awk -v count=$count -vaddr1="$addr1" ' 
$27==addr1 { 
    for(i=0;i<count;i++) 
    print > "temp.csv" 
}' /tmp/input.csv 
1

Вы можете использовать простой трюк: сломайте awk код (одиночные кавычки), чтобы разместить то, что вы хотите внутри, часть встроенного кода.

> a=10                           
> awk 'BEGIN{for (i=0;i<='${a}';i++){printf("%d ", i)}}' 
0 1 2 3 4 5 6 7 8 9 10 

хорошее: Простой и удобный.

Плохо: это делает вашу программу менее читаемой.

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