ループの引数としてawk出力パイプ

ループの引数としてawk出力パイプ

私が使用している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出力ファイルの末尾にファイル名サフィックスを追加する前に、出力ファイル名からファイル名サフィックスを削除します。_dndsvep -o "${file%.vcf.gz}_dnds" ...

おすすめ記事