将变量传递给awk时出错

时间:2012-01-17 03:04:44

标签: variables awk

我正在尝试使用awk -v将外部变量传递给awk 但只是无法弄清楚我的问题是什么!

for ((c=1;c<=22;c++));do cat hg19.gap.bed|awk -v var={chr"$c"} '{if ("$1"=="$var") print}' > $var.cbs;done

这个命令有什么问题? THX

3 个答案:

答案 0 :(得分:3)

在awk中,只有字段变量以$开头。你不希望awk中有双引号。试试if ($1 == var) ...

使用$var实际上意味着索引中的字段存储在var中,在这种情况下不是有效字段(但您可以使用它来迭代字段)。

答案 1 :(得分:1)

var={chr"$c"}应该生成什么?

它在这种情况下产生的是{chr1}{chr2},......,{chr22}

请注意,变量varawk变量,而不是shell变量。您必须重定向到"{chr$c}.cbs"才能获得22个单独的文件。在脚本中,$var始终为$0,因为var评估的数字为0

您可以在一次通过中完成所有操作,而不是22次运行命令。假设您在MacOS X(BSD)或任何符合POSIX的gawk上使用awk(GNU Awk)或awk,您可以写:

awk '$1 ~ /\{chr([1-9]|1[0-9]|2[012])\}/ {file=$1".cbs"; print $0 >file;}' hg19.gap.bed

这可以在整个数据文件中完成整个作业。

答案 2 :(得分:0)

我假设chr只是一些字符串,你想与chr1,chr2,....匹配。

for ((c=1;c<=22;c++));do cat hg19.gap.bed | awk -v var=chr"$c" '"$1"==var {print}' > chr"$c".cbs;done

请告诉我这是否适合您。