【发布时间】:2022-10-14 21:18:01
【问题描述】:
我正在尝试使用 awk 使用包含使用另一个 awk 脚本创建的数组的条件语句来提取数据。
我用于创建数组的 awk 脚本如下:
array=($(awk 'NR>1 { print $1 }' < file.tsv))
然后,在另一个 awk 脚本中使用这个数组
awk var="${array[@]}" 'FNR==1{ for(i=1;i<=NF;i++){ heading[i]=$i } next } { for(i=2;i<=NF;i++){ if($i=="1" && heading[i] in var){ close(outFile); outFile=heading[i]".txt"; print ">kmer"NR-1"\n"$1 >> (outFile) }}}' < input.txt
但是,当我运行它时,会发生以下错误。
awk: fatal: cannot open file 'foo' for reading (No such file or directory)
我已经查看了多篇关于为什么会发生此错误以及如何正确implement a shell variable in awk 的帖子,但到目前为止,这些都没有奏效。但是,当删除 shell 变量并运行脚本时,它确实可以工作。
awk 'FNR==1{ for(i=1;i<=NF;i++){ heading[i]=$i } next } { for(i=2;i<=NF;i++){ if($i=="1"){ close(outFile); outFile=heading[i]".txt"; print ">kmer"NR-1"\n"$1 >> (outFile) }}}' < input.txt
我真的需要那个条件语句,但不知道我在 awk 中实现 bash 变量时做错了什么,希望能得到一些帮助。
提前谢谢。
【问题讨论】:
-
您不能将数组传递给子进程。您只能传递单个字符串。这是 Linux(以及大多数(如果不是全部)其他操作系统)的设计限制,其中唯一可以被所有进程“理解”的值是字符串。要模拟传递数组,您必须首先将其序列化为字符串,然后在接收端对其进行反序列化。