【发布时间】:2012-02-11 22:27:47
【问题描述】:
我正在尝试使用 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
这个命令有什么问题? 谢谢
【问题讨论】:
我正在尝试使用 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
这个命令有什么问题? 谢谢
【问题讨论】:
在 awk 中,只有字段变量以 $ 开头。而且您不希望在 awk 中使用双引号。试试if ($1 == var) ...。
使用$var实际上意味着存储在var中的索引处的字段,在这种情况下不是有效字段(但您可以使用它来遍历字段)。
【讨论】:
var={chr"$c"} 应该产生什么?
它在这种情况下产生的是{chr1}、{chr2}、...、{chr22}。
请注意,变量 var 是 awk 变量,而不是 shell 变量。您必须重定向到 "{chr$c}.cbs" 才能获得 22 个单独的文件。在脚本中,$var 将始终为$0,因为作为数字评估的var 是0。
比起运行命令 22 次,您肯定可以一次完成所有操作。假设您在 MacOS X (BSD) 或任何符合 POSIX 的awk 上使用gawk (GNU Awk) 或awk,您可以这样写:
awk '$1 ~ /\{chr([1-9]|1[0-9]|2[012])\}/ {file=$1".cbs"; print $0 >file;}' hg19.gap.bed
这一次通过数据文件完成了整个工作。
【讨论】:
我假设 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
让我知道这是否适合你。
【讨论】:
$1 上没有引号,您可以完全放弃该操作,因为它是默认操作。