Практическое руководство передает строку как параметр в AWK в рамках сценария Bash

У меня есть текстовый файл, который я хочу отфильтровать использование awk. Текстовый файл похож на это:

foo 1
bar 2
bar 0.3
bar 100
qux 1033

Я хочу отфильтровать те файлы с 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 '$2>0 && $1==$col1type' $input

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

5
задан neversaint 16 March 2010 в 01:54
поделиться

3 ответа

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

awk "\$2>0 && \$1==\"$col1type\"" 
4
ответ дан 18 December 2019 в 07:29
поделиться

передать его, используя параметр -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
10
ответ дан 18 December 2019 в 07:29
поделиться

Одиночные кавычки запрещают расширение переменных в bash:

awk '$2>0 && $1=='"$col1type"
2
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: