En primer lugar, esa función solo registrará la primera "palabra" de todo lo que se le envíe, ya que usa $1
en lugar de "$*"
.
En segundo lugar, hay (como suele ser el caso con POSIX )innumerables maneras de hacer este tipo de cosas. Probablemente iría con algo como:
log() {
cat - >> "$logfile"
}
do_stuff | log
Pero también podrías:
(
do_stuff
do_more_stuff
) >> "$logfile"
En cuanto a la supresión completa de todos los resultados --, es mejor dejarlo para el entorno de invocación (e. gramo../thing 1> /dev/null 2> &1
)en lugar de bloquearlo "en código", por así decirlo. Dicho esto:
squashout="true" # comment this out to stop killing output
if ! [[ "true" = "${squashout-false}" ]]; then
# Redirect stdout and stderr to the null device.
exec 1> /dev/null
exec 2> /dev/null
fi
Variant Effect Predictor от 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"...
.
Я только что узнал, что первая часть вопроса решается за счет того, что awk обрабатывает стандартный ввод как обычный файл
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./