2014-02-05 3 views
0

У меня есть команда AWK для распечатки общего количества раз «200» произошло в колонке 26.Awk с переменной

awk '$26 ~ /200/{n++}; END {print n+0}' testfile 

Как изменить это заявление, так что я могу передать 200 в качестве переменной? например если у меня есть переменная $ код со значением 200

Заранее спасибо

+0

Если 'code' имеет значение ' 20' и число '200' появляется в поле 26, должно совпадать или нет? Вы ищете совпадение поля WHOLF 26 или только его часть? –

ответ

3
awk '$26 ~ code {n++} END {print n+0}' code=200 testfile 

Если имя файла в командной строке имеет вид вар = значение оно рассматривается как переменная назначения. Переменной var будет присвоено значение val.

§ Awk Program Execution

+0

Это то, что я не знал, но хотел бы отметить, посмотрев его в «языке программирования AWK»: имя файла var = val присваивается 'в то время, когда этот аргумент в противном случае был бы доступен как файл. Этот тип присваивания позволяет изменять переменные до и после чтения файла. «Значение этого порядка важно. – n0741337

+0

@ n0741337 Правильно, и переменные, назначенные таким образом, недоступны в разделе BEGIN, которые могут вызвать путаницу/ошибки. Этот метод следует использовать только в том случае, если вам нужно изменить значение переменных между файлами, иначе 'awk -v awkvar =" $ shellvar "почти всегда является правильным. См. Статью, которую я написал для часто задаваемых вопросов comp.unix.shell, по адресу http://cfajohnson.com/shell/cus-faq-2.html#Q24. –

2
awk -v var="$shellVar" '$26~var{n++} END{print n}' file 

вы видите выше линии, как использовать переменную оболочки в AWK. некоторые заметки для вашего AWK однострочника:

  • print n+0 нет необходимости. потому что n указанного вами, не выбрали из входного текста, и вы явно делали n++, так что тип номера, n+0 не имеет смысла

  • ; перед тем END должен быть удален

  • Я скопировал код о проверке 200 частей. но это рискованно. если $ 26 имеет только номер, вы можете рассмотреть возможность использования 1*$26 == 200 или $26 == "200" используя регулярные выражения в этой ситуации может дать неправильный результат, подумайте о том, в вашем $ 26, стоимость была: 20200

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