Канал вывода Awk как аргумент в цикле

En primer lugar, esa función solo registrará la primera "palabra" de todo lo que se le envíe, ya que usa $1en 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
0
12.07.2019, 11:27
2 ответа

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

2
28.01.2020, 02:29

Я только что узнал, что первая часть вопроса решается за счет того, что 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./
0
28.01.2020, 02:29

Теги

Похожие вопросы