.vcfファイルをインポートしてファイルを解析し、.txtに書き込むスクリプトがあります。
grep -v "#" file.vcf | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' > vcf_output.txt
.vcf
このスクリプトを同時に実行し、そのファイル名.vcf
で各ファイルの出力を作成したい27個のファイルがあります。.txt
.vcf
Googleでこれを見つけましたが、実行後に何も起こりませんでした
for f in *.vcf; do
script "$f" > "${f%.*}.txt"
done
私は以下のようなものを使用しました。
for f in *.vcf; do
grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"
done
私も試しました
(base) loan-mac-13:Pre_Treatment fi1d18$ find -type f -name "*.vcf" | xargs grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"
find: illegal option -- t
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
sed: : No such file or directory
(base) loan-mac-13:Pre_Treatment fi1d18$
私に役立つようにどのように推進できますか?
答え1
script "$f"
Google出力をシェルループスクリプトから(欠落している)に変換してから、grep -v "#"
それを使用するのではなく、スクリプトの間違った場所で使用しています。"$f"
"$f"
{}
xargs
とにかく、awkを使用すると、パイプラインにsedとgrepがあまり必要ありません。入力/出力の例を提供していないので、次のawkスクリプトは既存のパイプラインを直接変換したものです。より良い書き方があるかもしれませんが、このawkスクリプトが必要です。シェルループやその他の項目はありません。 :
awk '
FNR == 1 {
close(out)
out = FILENAME
sub(/\.vcf$/,".txt",out)
}
!/#/ {
sub(/chrM/,"MT")
sub(/chrX/,"X")
sub(/chrY/,"Y")
$0 = $1 OFS $2 OFS $2 OFS $4 "/" $5 OFS "+"
gsub(/chr/,"")
print > out
}
' *.vcf
grep+seds+awk パイプを使用するのと同じように、より少ない行で作成するには、各行の後を除き、削除するすべての改行にセミコロンを使用できます。{
たとえば、次のようになります。
awk 'FNR==1{close(out); out=FILENAME; sub(/\.vcf$/,".txt",out)} !/#/{sub(/chrM/,"MT"); sub(/chrX/,"X"); sub(/chrY/,"Y"); $0=$1 OFS $2 OFS $2 OFS $4 "/" $5 OFS "+"; gsub(/chr/,""); print > out}' *.vcf
答え2
findとxargsを使用してこれを行うことができます。
検索はすべてのファイルを一覧表示します。
find -type f -name "*.vcf"
xargsを使用すると、見つかったすべてのファイルに対して操作を実行できます。
find -type f -name "*.vcf" | xargs grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"
私はこれをする必要がありますか?
挨拶
答え3
以下は、プロセスを変更せずに機能する必要があります。パイプラインの最初のコマンドであるgrepには何も入力しませんでした。だから何も動かなかった。
for f in *.vcf; do
< "$f" grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' > "${f%.*}.txt"
done