Преобразование из tsv в fasta

У меня в папке есть куча TSV файлов и для каждого из них я хотел бы получить файл fasta где заголовок после знака '>' это имя файла. В моем TSV-файле 5 столбцов без заголовка:

Таким образом:

входной файл с именем: "A.coseq.table_headless.tsv" HIV1B-pol-seed 15 MAX 1959 GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC выходной файл с именем "A.fasta"

>A_MAX

GTAACAGACTCACAATATGCATTAGGAATCATTCAAGC

Я хочу запустить скрипт одновременно в bash для всех файлов, и у меня есть этот скрипт, который не работает, потому что в операторе печати awk у меня есть фигурная скобка:

for sample in `ls *coseq.table_headless.tsv`
do
base1=$(basename $sample "coseq.table_headless.tsv")
awk '{print ">"${base1}"_"$3"\n"$5}' ${base1}coseq.table_headless.tsv > ${base1}fasta

done

Любая идея, как исправить этот код? Большое тебе спасибо


person Mariano Avino    schedule 14.06.2017    source источник


Ответы (3)


если базовое имя является частью до первого «.», вы также можете избавиться от цикла.

 awk '{split(FILENAME,base,"."); 
       print ">" base[1] "_" $3 "\n" $5 > base[1]".fasta"}' *coseq.table_headless.tsv
person karakfa    schedule 14.06.2017
comment
Возможно, подождите немного еще один ответ и stackoverflow.com/help/someone-answers - person karakfa; 14.06.2017

Другие решения, опубликованные до сих пор, имеют несколько проблем:

  1. если вы не закроете файлы по мере их написания, это приведет к ошибкам «слишком много открытых файлов», если вы не используете GNU awk,

  2. вычисление имени выходного файла каждый раз при чтении строки, а не один раз при открытии входного файла неэффективно, и

  3. использование выражения в скобках справа от перенаправления вывода является неопределенным поведением и поэтому будет работать только в некоторых awk (включая GNU awk).

Это будет надежно и эффективно работать во всех awks:

awk '
    FNR==1 { close(out); f=FILENAME; sub(/\..*/,"",f); pfx=">"f"_"; out=f".fasta" }
    { print pfx $3 ORS $5 > out }
' *coseq.table_headless.tsv
person Ed Morton    schedule 14.06.2017

Другое решение awk:

awk '{ pfx=substr(FILENAME,1,index(FILENAME,".")-1); 
       printf(">%s_%s\n%s\n",pfx,$3,$5) > pfx".fasta" }' *coseq.table_headless.tsv 

  • pfx содержит первую часть имени файла (до первой .)
person RomanPerekhrest    schedule 14.06.2017