【问题标题】:How to pass string or variable as multiple parameters for awk within a bash scripts?如何在 bash 脚本中将字符串或变量作为 awk 的多个参数传递?
【发布时间】:2016-01-19 09:36:30
【问题描述】:

我正在尝试将变量 $formula 传递到 awk 脚本中:

[node2 filtering]$ echo $formula
$25 ~ "1/1" && $24 ~ "1/1" && $23 ~ "1/1" && $22 ~ "1/1" && $21 ~ "1/1" && $20 ~ "1/1" && $19 ~ "1/1" && $18 ~ "1/1" && $17 ~ "1/1" && $16 ~ "1/1" && $15 ~ "1/1" && $14 ~ "1/1" && $13 ~ "1/1" && $12 ~ "1/1" && $11 ~ "1/1" && $10 ~ "1/1"||$10 ~ "0/1" && $11 ~ "0/1" && $12 ~ "0/1" && $13 ~ "0/1" && $14 ~ "0/1" && $15 ~ "0/1" && $16 ~ "0/1" && $17 ~ "0/1" && $18 ~ "0/1" && $19 ~ "0/1" && $20 ~ "0/1" && $21 ~ "0/1" && $22 ~ "0/1" && $23 ~ "0/1" && $24 ~ "0/1" && $25 ~ "0/1"

我正在尝试传递以下内容来过滤我的文本文件,但是当我没有过滤时。我也没有收到错误。

awk -F\\t  -v myvar="$formula" 'myvar {print $0}' myfile

这行得通:

awk -F\\t '$10 ~ "0/1" + $11 ~ "0/1"+ $12 ~ "0/1"+ $13 ~ "0/1"+ $14 ~ "0/1"{print $0}' myflies

我尝试这样做的原因是我有一个简单的 for 循环,它根据我要过滤的列数创建 $formula。我决定过滤的列数仅基于实验中的受试者数量,并且始终为$10$(10+n),其中 n 是受试者的数量。

对于如何解决此问题或以不同方式构建我的脚本的任何想法或提示将不胜感激?

这是构造$formula的愚蠢的for循环:

blah1=$(echo "")
blah2=$(echo "")
for (( i=1; i <= $NUMBEROFSUBJECTS; i++ ))
    do
     l=$(echo $(( i + $minus )))``

    if [ $i == 1 ] ; then
             blah1=$(echo " \$$l ~ \"1/1\" ")
             blah2=$(echo " \$$l ~ \"0/1\" ")
    else
            inter1=$(echo " \$$l ~ \"1/1\" ")
            blah1=$(echo $inter1 + $blah1)

            inter2=$(echo " \$$l ~ \"0/1\" ")
            blah2=$(echo $blah2+$inter2)
    fi
done
formula=$(echo $blah1  " || " $blah2)`

awk -F\\t -v myvar="$formula" 'myvar {print $0}' 的想法来自:

Howto Pass A String as Parameter in AWK within Bash Script

编辑: 对我有用的答案最终是:

 awk -F\\t "$formula"'{print $0}' myfile

非常感谢大家。对不起,它最终变得如此简单。

【问题讨论】:

  • 变量用于数据,而不是代码。
  • 那么它会是一个参数还是一个参数或其他什么?

标签: linux bash shell variables awk


【解决方案1】:

做这样的事情:

formula="$blah1|$blah2"
...
awk "/$formula/ {...}"

所以建议是跳过变量定义,只依赖shell替换。

【讨论】:

  • 我会将双引号限制为 shell 扩展所必需的,例如 "/$formula/"'{...}'
  • 当我尝试"/$formula/ {...}""/$formula/"'{...}' 的@yacc 或@chepner 方法时,我不断收到:awk: ^ unterminated string。有什么想法吗?
  • awk -F\\t /"$blah1/"'{print $0}' myfileawk -F\\t /"$blah1/{print $0}" myfile 是命令行调用。公式的内容在主要问题中。 @yacc
  • 未终止的字符串箭头指向$formula{print $0} 相遇的地方
  • 摆脱斜线使它对我有用。 awk -F\\t "$formula"'{print $0}' .
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 2020-06-30
  • 1970-01-01
  • 2012-01-23
  • 2021-06-29
  • 2016-09-15
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多