
私が使用している2番目のプログラムのパラメータから出力を解析して使用するために必要ないくつかのファイルがあります。
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 ./