![awk 输出管道作为循环中的参数](https://linux22.com/image/157009/awk%20%E8%BE%93%E5%87%BA%E7%AE%A1%E9%81%93%E4%BD%9C%E4%B8%BA%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0.png)
我有一些文件需要解析并在我正在使用的第二个程序的参数中使用输出:
for file in ./*.vcf.gz; do
echo "gunzip -c ${file} | awk 'BEGIN{FS=OFS=\"\t\"} NR == FNR{key[\$1]=\$2; next} \$1 in key{\$1=key[\$1]} 1' ./map | cut -f1-6 | sed '1,6d' | vep -i -o ./"${file}"_dnds --compress_output gzip --dir_cache ./"
done
但它落在 awk 命令的位置
gunzip -c ${file} | awk 'BEGIN{FS=OFS=\"\t\"} NR == FNR{key[\$1]=\$2; next} \$1 in key{\$1=key[\$1]} 1' ./map input
然后,对于进入 vep 程序的最后一个管道通道,我也不知道如何制作它,以便输出进入 -i 输入,如下所示:
vep -i input -o ./"${file}"_dnds --compress_output gzip --dir_cache ./"
这些是巨大的文本文件。如何在不读取临时文件的情况下执行此操作?
答案1
EnsEMBL 的变异效应预测器默认从标准输入读取(文档在这里)。
这意味着-i
完全忽略该选项(及其选项参数)将使其从管道读取输入。
我不确定您想在管道中做什么,但看起来好像您正在尝试用其他标识符替换某些标识符,从单独的文件中读取。这样做时,您使用的awk
程序中含有无用的反斜杠。该awk
命令可以写为
awk 'BEGIN { FS=OFS="\t" } NR == FNR { key[$1]=$2; next} ($1 in key) { $1=key[$1] } 1' map -
输入-
文件名awk
在到达它时从其标准输入中读取(在处理名为 的文件之后map
)。
awk
是一种比您的管道所赋予的更强大的语言,您可以轻松地将cut
和sed
代码合并到其中:
awk 'BEGIN { FS=OFS="\t" } NR == FNR { key[$1]=$2; next} ($1 in key) { $1=key[$1] } FNR > 6 { print $1, $2, $3, $4, $5, $6 }' map -
你的脚本可能看起来像
#!/bin/sh
for file in ./*.vcf.gz; do
gzip -cd "$file" |
awk 'BEGIN { FS=OFS="\t" } NR == FNR { key[$1]=$2; next} ($1 in key) { $1=key[$1] } FNR > 6 { print $1, $2, $3, $4, $5, $6 }' map - |
vep -o "${file}_dnds" --compress_output gzip --dir_cache ./
done
(另请注意变量扩展的正确双引号)
您是否希望在附加到输出文件末尾.vcf.gz
之前从输出文件名中删除文件名后缀,请使用._dnds
vep -o "${file%.vcf.gz}_dnds" ...
答案2
我刚刚发现问题的第一部分是通过让 awk 将 stdin 视为常规文件来解决的
gunzip -c ${file} | awk 'BEGIN{FS=OFS=\"\t\"} NR == FNR{key[\$1]=\$2; next} \$1 in key{\$1=key[\$1]} 1' ./map -
但仍然不知道如何将解析的输出通过管道传输到
vep -i input -o ./"${file}"_dnds --compress_output gzip --dir_cache ./