我正在尝试编写一个脚本来过滤bash中的表(使用awk
),并考虑每个表的不同字段。
我有个主意,但是我对代码有些迷惑:
foo="22 24 29 33"
。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"
。awk $aux 'col24 < 10 ... {print}'
但是我想对其进行优化(或者也许有另一种更简单的方法),以针对不同的字段和多个字段自动执行此过程。任何想法都将受到欢迎!谢谢!
编辑:我想同时考虑所有字段,而不是一个一个地考虑,像这样的awk '$22 >= 5 && $24 >= 5 && $29 >= 5 && $33 >= 5 {print}' file
... @kvantour回答是正确的,但是我没有足够的解释问题和输出。还有其他帮助吗?
答案 0 :(得分:2)
有一种更简单的方法:
foo
一样的bash变量。这给出了:
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