Я использовал //
как разделитель и затем sed -in 's/\/\//\x0/g' dirstats
получить то, что я хочу. Я все еще предпочел бы меньше hackish решения.
awk '
/^>/ {
# print the first header
if (c++ == 0) {print; print ""}
next
}
/^$/ {next}
{printf "%s", $0}
END {print ""}
' a.fasta > b.fasta
содержимое b.fasta
>1
AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
Самый простой способ - это просто вывести 1-ю строку, а затем все остальные строки файла, которые не содержат i) символов пробела (в быстрых файлах они не имеют значения) и ii) строку быстрого заголовка (>
):
head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' >> newfile.fa
Глава
печатает 1-ю строку, а регулярное выражение grep ищет все строки, которые содержат только не>
и не пробельные символы ([^> ]
) от начала (^
) до конца ($
) этой строки.
Однако в результате получится файл типа:
>1
AAATTTTGGGGCCC
ACCCCGGGTTT
ATGCCCCCCCCCC
Чтобы получить всю последовательность на одной строке, используйте вместо этого вот это:
head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' | tr -d '\n'>> newfile.fa;
Затем вы можете добавить дополнительную новую строку в конец файла с помощью
echo "" >> newfile.fa
Однако, если вы будете работать с такими файлами, я предлагаю сохранить эти два скрипта в файле в вашем $PATH ($HOME/bin
, например) и сделать их исполняемыми (chmod a+x $HOME/bin/scriptname
):
Этот сценарий берет быстрый файл и меняет его на tbl формат (заголовок быстрого файла, табуляция, а затем последовательность, все в одной строке):
#! /bin/sh
gawk '{
if (substr($1,1,1)==">")
if (NR>1)
printf "\n%s\t", substr($0,2,length($0)-1)
else
printf "%s\t", substr($0,2,length($0)-1)
else
printf "%s", $0
}END{printf "\n"}' "$@"
Это делает обратное, берет файл в tbl формате и преобразует его в корректный быстрый файл (>
заголовок и 60 символов в строке):
#! /bin/sh
gawk '{
sequence=$NF
ls = length(sequence)
is = 1
fld = 1
# if (fld == 1){printf ">"}
while (fld < NF)
{
if (fld == 1){printf ">"}
printf "%s " , $fld
if (fld == NF-1)
{
printf "\n"
}
fld = fld+1
}
while (is <= ls)
{
printf "%s\n", substr(sequence,is,60)
is=is+60
}
}' "$@"
Если бы у вас были эти сценарии, вы могли бы сделать то, что вы просили, просто запустив:
$ head -n 1 file.fa; FastaToTbl file.fa | awk -F"\t" '{print $2}'
>1
AAATTTTGGGGCCC
ACCCCGGGTTT..........
ATGCCCCCCCCCC
Или, чтобы получить правильный fasta-файл:
$ head -n 1 file.fa > newfile; FastaToTbl file.fa |
awk -F"\t" '{printf "%s", $2}' | TblToFasta >> newfile
Который производит:
>1
AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
{ echo '>1'; tr -dc '[:alpha:]'; } <infile >outfile
Вам не нужно извлекать первую строку из файла - просто echo
заголовок. И если вы удалите все, кроме буквенных символов, вы просто автоматически получите то, что хотите.