Bash

awk 輸出管道作為循環中的參數

  • July 12, 2019

我有一些文件要解析並在我正在使用的第二個程序的參數中使用輸出:

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是一種比你的管道賦予它的功勞更強大的語言,你可以輕鬆地將程式碼cutsed程式碼合併到其中:

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" ....

引用自:https://unix.stackexchange.com/questions/529703