我正在尝试使用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
答案 0 :(得分:3)
在awk中,只有字段变量以$
开头。你不希望awk中有双引号。试试if ($1 == var) ...
。
使用$var
实际上意味着索引中的字段存储在var
中,在这种情况下不是有效字段(但您可以使用它来迭代字段)。
答案 1 :(得分:1)
var={chr"$c"}
应该生成什么?
它在这种情况下产生的是{chr1}
,{chr2}
,......,{chr22}
。
请注意,变量var
是awk
变量,而不是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
请告诉我这是否适合您。