将awk过滤器应用于可变长度的循环

时间:2018-11-05 12:24:54

标签: awk

我正在尝试编写一个脚本来过滤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 :(得分:2)

有一种更简单的方法:

  • 创建foo一样的bash变量。
  • 将完整的字符串传递给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