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

标签 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

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

最佳答案

变量 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 进行剩余的处理

关于linux - 将信息保存为一系列管道中间的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27026379/

相关文章:

linux - 在 Linux 上运行 .sh 脚本时出现语法错误。我究竟做错了什么?

找不到 Bash 变量分配和命令

linux - 将 open vswitch 连接到两个虚拟机

python - sudo su user -c 参数不起作用

linux - 更改文本文件的格式

linux - Zcat + awk 带绝对路径

linux - awk:选择文本并使用它

linux - 从命令行进行类似于 Scala 的 Flatten

c++ - Apache thrift 做不到

Bash 换行和历史滚动