Bash
awk 輸出管道作為循環中的參數
我有一些文件要解析並在我正在使用的第二個程序的參數中使用輸出:
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 ./"
這些是巨大的文本文件。如何在不讀入臨時文件的情況下做到這一點?
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" ...
.