Количество слов для длины последовательности неверно

У меня есть файл fasta, который выглядит так:

>0011 my.header
CAAGTTTATCCACATAATGCGAATAACCAATAATCCTTTTCATAAGTCTATTCTTCATAATCTAAATCGT
TTTCAAGTACATAATTATCCTTTGCCTGTTCGTTAGTTTTATTAAAATTATACTGATCTTTCTTTTTCAT
CCCACGGGTTAAAATCTTCCTCAATCGGTGGGTTTTCTTCATGAAATTGTTTCATTTATTTGCTGTTTTT
AGTTCTCCGATTGTATAACACTTAGTTGTATTAGTGCCGGGTAGTCTATAATTAGCCTCTTTTATATACC
CACGCTTTAATAATCTGTTTACAGAATTATATAATTTGCTCTTAGACATAAAAGGAATAATTTCTCTAAG
TTTAGAAATCGTAATAAAAACGGTATTAGGTTCTTTCTTTACCCTACATCCCTTAAACTTATCCTTATAT
GTATCAGTACAAAGTATAAGAAACATAACTGAATATACTACTGAATCATCTAAACCGATTTCTTTTGCTA
AATCTTCATTTATAACCATAATTATAACGCTTTTAATTGAATTGACTCTTTAACATTTGATGTTTTAACG
AACTGATCGTATATTTCCGGATATTGTTCTTTCAGTGCTTTAGAATCAAGTGATTCACGGCTATACGCTT
TCTTCCTTGTGACTGAAATAAGTTCCCCTTTTATATTATCAGCTTTCGCCTCAGACATCAGACCTAACAA
CTGTTCTTTGAACTTGCCTAAATGTTCGTCTATCTTCTTTTGCATTTCAAGAAGTTCGTAAACGCCTTCT
TCGATATGTGCAACCTTTGCAGGCAACGACTCCAATTTAGCTACATAACTGTCTTTGCTTGCATTGTCTG
CATATCGAACTCCATTCTTACAGCAATTAAGGAATAATTCTATTTCGCTGTCCGGTATGCGTTCAACAGA
GAAAATTCCGTCCTTATCCTTGTCACCTCTTAGCCAAATTGCGATAAGTCCCTCTACTTTCAAATTTGGG
TTTTGTCTCTCGAAAAGATAGGCGTATATTGATAGCTGCCAAGACAAATAAAGCAAATCAAGTTTGTAGG
TAGTTTTAATGTCACCTAAAACGACTGATTTATCAGAGCTGCCCAAATATACTTTATCGGTCGGTGATGC
GATAAGCTCGTTATCAGTTAGAATATACTCAGATGCGATATGAATTAAACCGCTTCCGGCTTTTAAATTC
AAATAGTTCTCTCCGTAGACCGTTTCCGGTTCAATACCTTCTTTGTCGATCCTCTCAACTTCATCATGAA
CCGCTTTCCCTCTCTCAGTTGCCGATCTCAAAATATTATCCGGTATATTGTCAAGTTTGCCTGGAAATAA

и я хочу длину последовательности (без заголовка). Я попробовал это:

tail -n +2 my.file | wc -c

который дает мне такой вывод:

1349

что не так, реальный размер 1330.

Я не уверен, что происходит. Я думаю, что, возможно, есть какие-то скрытые персонажи, но я не знаю, как это исследовать.

5 ответов

Решение

Это потому что wc также считает все разрывы строк.

Вы можете использовать awk чтобы сделать это:

awk 'NR>1{s+=length()} END{print s}' my.file

1330

Вы также можете использовать tail | tr | wc:

tail -n +2 my.file | tr -d '\n' | wc -c
1330

РЕДАКТИРОВАТЬ: Добавление еще 1 решения awk здесь тоже.

awk -v RS="" -v FS="\n" '{$1="";sub(/^ +/,"");gsub(/ /,"");print length($0)}'  Input_file

ИЛИ ЖЕ

awk -v RS="" -v FS="\n" '{$1="";sub(/^ +/,"");print length($0)}' OFS=""  Input_file

ИЛИ ЖЕ

awk -v RS= '{gsub(/^[^\n]*|\n/, ""); print length()}'  Input_file

Следующий awk может помочь вам в том же.

awk '!/^>/{sum+=length($0)} END{print "Length is:" sum}'  Input_file

Perl:

perl -0777 -nE 's/^>.*$//m; say tr/A-Z/A-Z/' file

Это считывает файл в одну строку, удаляет первую строку и считает буквы.

Только в bash, в скрипте мы должны поговорить о программировании; о)

tk="$(<my.file)"      # file in variable
tk="${tk#>*$'\n'}"    # suppression header '>...first\n'
tk="${tk//$'\n'}"     # suppression all \n

echo ": ${#tk}"       # 1330  \o/

Вычтите количество строк из символов после удаления заголовка:

tail -n +2  fasta.file | wc -lc | awk '{print $2-$1}'
Другие вопросы по тегам