Применить фильтр awk для цикла переменной длины - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь написать скрипт для фильтрации таблиц в bash (с awk) с учетом различных полей для каждого из них.

У меня есть идея, но я немного запутался с кодом:

  1. Создайте переменную со столбцами для фильтрации, например, foo="22 24 29 33".
  2. Создать (хитрый) цикл, чтобы сгенерировать строку с переменными для добавления к awk, т. Е. aux=$(for i in $foo; do echo '-v col$i="$(echo $i)"'; done). Вывод должен быть таким (это мое первое сомнение): -v col22="22" -v col24="24" -v col29="29" -v col33="33".
  3. И, наконец, awk $aux 'col24 < 10 ... {print}'

Но я бы хотел оптимизировать (или, может быть, есть еще один более простой способ сделать это) для автоматического выполнения этого процесса для разных полей и нескольких полей. Любая идея будет приветствоваться! Спасибо!

РЕДАКТИРОВАТЬ : Я хотел бы рассмотреть все поля одновременно, а не одно за другим, что-то вроде этого awk '$22 >= 5 && $24 >= 5 && $29 >= 5 && $33 >= 5 {print}' file ... @kvantour ответ, это правильно, но я недостаточно объяснил вопрос и выход. Любая дополнительная помощь, пожалуйста?

1 Ответ

0 голосов
/ 05 ноября 2018

Есть более простой способ:

  • Создайте переменную bash так же, как ваш foo.
  • Передайте эту полную строку Awk, и пусть awk сделает все остальное:

Это дает:

awk -v fields="$foo" 'BEGIN{split(fields,f)}{ for(i in f) if ($(f[i]) < 10) print }' file

Конечно, теперь вы можете выполнять различные условия:

предположим, bar это список условий

$ foo="22 24 29 33"
$ bar="10 20 30 40"

$ awk -v fields="$foo" -v conditions="$bar" '
     BEGIN{split(fields,f); split(conditions,c)}
     { for(i in f) if ($(f[i]) < c[i]) { print; next } }' file

примечание: , поскольку ваш вопрос немного нечеток, я не знал, что на самом деле должен делать ваш сценарий. Тем не менее, я надеюсь, что это дает вам представление.

после редактирования

$ awk -v fields="$foo"  '
         BEGIN{split(fields,f)}
         { a=1; for(i in f) a = a&& ($(f[i]) >= 5) }
         a' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...