将信息保存为一系列管道中间的变量

时间:2014-11-19 20:29:15

标签: linux bash awk

我正在尝试在一系列管道中保存有关中间文件的一些信息。这些信息可以从最初的几十行收集,所以理想情况下我不想处理整个事情两次。

我想要的最终结果是存储为变量的整数值,然后脚本可以将其用于下一步。

到目前为止我所拥有的是

samtools bamshuf -Ou test.bam tmp | tee >($(eval READ_LEN=$(awk '{print length($10)}' | head -100 | sort -u))) | samtools bam2fq - | gzip -f > $OUT

我希望READ_LEN包含输入文件中第10列的前100行的第一个排序长度。

当我运行此操作时,我没有收到任何错误,但未设置READ_LEN。我认为这是因为eval的使用,因此stdout没有被传递到awk

如何在一系列管道中间将信息保存到这样的变量中?

1 个答案:

答案 0 :(得分:2)

变量READ_LEN在子shell中设置(因为它包含在“$(...)中。当子shell退出变量时被销毁。捕获值并在父shell中设置变量像

这样的东西
while read value; do
  [ -n "$READ_LEN" ] && READLEN+=" "
  READ_LEN+=$value
done < <(samtools bamshuf -Ou test.bam tmp | awk '{print length($10)}' | head -100 | sort -u)

然后使用READ_LEN进行剩余的处理