сортировать файл fasta по его буквенно-цифровым идентификаторам

Это не извлечение, потому что вы использовали опцию -v, которая указывает unzipпоказывать вам только каталог архива, не извлекая его.

Поскольку параметр -dимеет смысл только при извлечении, он предупреждает вас, что игнорирует его, но ошибается в сторону осторожности и не извлекает.

-1
03.08.2020, 18:33
3 ответа
  1. С GNU sortплюс POSIX awkиcut:

    awk '/^>/{key=$1} {print key, $0}' file | sort -k1,1 -s | cut -d' ' -f2-
    

    Это работает, потому что мы можем использовать опцию сортировки GNU-s(«стабильная сортировка» ), чтобы обеспечить сохранение исходного порядка строк в каждом блоке вместо того, чтобы печатать и дополнительно сортировать исходные номера строк, как в следующем примере. пример.

  2. Как вариант, со всеми инструментами POSIX/стандартными UNIX:

    awk '/^>/{key=$1} {print key, NR, $0}' file | sort -k1,1 -k2,2n | cut -d' ' -f3-
    

    Преимущество этого варианта в том, что он будет работать на всех системах UNIX.

Оба вышеперечисленных варианта имеют преимущество по сравнению с приведенным нижеgawk-единственным вариантом, заключающимся в том, что awkне нужно хранить весь входной файл в памяти, поэтому он будет работать даже для массивных входных файлов -только sortв этом конвейере должен обрабатывать весь файл, и для этого он использует пейджинг по запросу и т. д.

  1. Наконец, с GNU awk дляsorted_in(см.https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Scanning):

    awk '
        /^>/{key=$1} {vals[key]=vals[key] $0 ORS}
        END { PROCINFO["sorted_in"]="@ind_str_asc"; for (key in vals) printf "%s", vals[key] }
    ' file
    

    Последний вариант действительно предпочтительнее, только если вы делаете это как промежуточную часть какого-нибудь более крупного awkскрипта, и поэтому использование внешней оболочки для сортировки является менее желательным вариантом.

2
18.03.2021, 23:15

При сортировке и сортировке GNU предполагается, что нулевые байты не могут появляться в вашем файле:

sed 's/^>/\x00&/' file  | sort -z | tr -d '\0'

Это разделяет блоки, начинающиеся с >, нулевым байтом, затем использует опцию -z/ --zero-terminatedсортировки GNU для лексикографической сортировки записей, затем trудаляет нулевые байты.

4
18.03.2021, 23:15

Это та же основная идея, что и хитрый \0трюк гостя , но не требует инструментов GNU:

$ perl -pe '/>/ ? s/\n/\t/ : s/\n//; ' foo.fa | sort | perl -pe 's/(?<=.)>/\n>/g; y/\t/\n/' | fold -w 60
>Ipunensis_00386        Yfr1
GCGGAGACGAAAGTTTCCGTTCACTCCTCACACCACACTCCGCCCAAATCATTGATTTGG
GCGGTT
>Ipunensis_00401        tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
GCGTTACCCGCT
>Ipunensis_00001        transposase IS4 family protein
ATGCAGAAGTTTCAGGGCATCCACTGGGTCAACCTAGACGGGCAGCACCAGGTTAGCAAT
CTCAGTGATGAGCGACGCTTAATCATCCACCTCTTGGGGCCACCTGTTGAGCGCTACTAC
CATGCCCCTGGTTAA
>Ipunensis_00002        Photosystem I assembly protein Ycf3
ATGCGTCACCCCGCCAAGTTACTCGGGTTAGTCACTCTCACCAGTATGCTTACGCTGGCT
>Ipunensis_00003        Cell wall-associated protease
ATGAAACGTTTTCTGACCAGTCTTTTGCTGACGGGCCTGCTTTGGCATAGTGGGGGCAGC
GTTGGGGTTGGGAGAGGTGCGATCGCACAAACCCAGTCCACCCCAGACCTCTACTACACC
>Ipunensis_00004        Photosystem I assembly protein Ycf3
TTGACCTGCGGCCCGCAGCCCTACCTGCCCAACCTGACTCCAGAAATTCCCATGATCTAC
CGCCTCTCGTCTCCCGGATTTTTGCTGGCGCTGCTGCTGCTATCTGCCGTCGATCCGGCA
>Ipunensis_00226        tRNA-Leu(gag)
TGCGGATGTGGTGGAACTGGTAGACACGCACGTTTGAGGGGCGTGTGGCTTACGCCTTGC
GAGTTCGAGTCTCGCCATCCGCAT
>Ipunensis_00045        tRNA-Ala(cgc)
GGGGAATTAGCTCAGCTGGTAGAGCGCTGCGATCGCACCGCAGAGGTCAGGAGTTCGAAT
CTCCTATTCTCCA
>Ipunensis_00357        glnA
ATCGTTCATCTCTTCAAACTGTCAAAGCTACTTACAAAAGCTACAGACGCACCAAGAGAC
GGAAGTAGGGGTCTGATCCCCCCGAAGGAACGCGCC
>Ipunensis_00403        tRNA-Gly(gcc)
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC

Пояснение

Первая команда perlзаменит новые строки символом \tв строках, содержащих >, и ничего в строках, в которых его нет. Это помещает идентификатор и последовательность в одну строку, разделенную символом табуляции.

Затем он передается в sort, а затем второй perl, который заменяет >новой строкой, но только если перед ними есть другой символ (, чтобы избежать добавления дополнительной новой строки перед первой записью ). Это конвертирует обратно в формат, подобный fasta -.

Наконец, мы пропускаем вывод через fold -w 60, чтобы получить стандартный 60 -char формат fasta. Обратите внимание, однако, что это также приведет к сворачиванию строки идентификатора, если у вас есть строки идентификатора с более чем 60 символами. Если это проблема, вы можете попробовать два awkсценария, которые я опубликовал ранее , и выполнить:

$ FastaToTbl foo.fa | sort | TblToFasta 
>Ipunensis_00001 transposase IS4 family protein 
ATGCAGAAGTTTCAGGGCATCCACTGGGTCAACCTAGACGGGCAGCACCAGGTTAGCAAT
CTCAGTGATGAGCGACGCTTAATCATCCACCTCTTGGGGCCACCTGTTGAGCGCTACTAC
CATGCCCCTGGTTAA
>Ipunensis_00002 Photosystem I assembly protein Ycf3 
ATGCGTCACCCCGCCAAGTTACTCGGGTTAGTCACTCTCACCAGTATGCTTACGCTGGCT
>Ipunensis_00003 Cell wall-associated protease 
ATGAAACGTTTTCTGACCAGTCTTTTGCTGACGGGCCTGCTTTGGCATAGTGGGGGCAGC
GTTGGGGTTGGGAGAGGTGCGATCGCACAAACCCAGTCCACCCCAGACCTCTACTACACC
>Ipunensis_00004 Photosystem I assembly protein Ycf3 
TTGACCTGCGGCCCGCAGCCCTACCTGCCCAACCTGACTCCAGAAATTCCCATGATCTAC
CGCCTCTCGTCTCCCGGATTTTTGCTGGCGCTGCTGCTGCTATCTGCCGTCGATCCGGCA
>Ipunensis_00045 tRNA-Ala(cgc) 
GGGGAATTAGCTCAGCTGGTAGAGCGCTGCGATCGCACCGCAGAGGTCAGGAGTTCGAAT
CTCCTATTCTCCA
>Ipunensis_00226 tRNA-Leu(gag) 
TGCGGATGTGGTGGAACTGGTAGACACGCACGTTTGAGGGGCGTGTGGCTTACGCCTTGC
GAGTTCGAGTCTCGCCATCCGCAT
>Ipunensis_00357 glnA 
ATCGTTCATCTCTTCAAACTGTCAAAGCTACTTACAAAAGCTACAGACGCACCAAGAGAC
GGAAGTAGGGGTCTGATCCCCCCGAAGGAACGCGCC
>Ipunensis_00386 Yfr1 
GCGGAGACGAAAGTTTCCGTTCACTCCTCACACCACACTCCGCCCAAATCATTGATTTGG
GCGGTT
>Ipunensis_00401 tRNA-Gly(gcc) 
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
GCGTTACCCGCT
>Ipunensis_00403 tRNA-Gly(gcc) 
GCGGGTATAGCTCAGTGGTAGAGCGTCACCTTGCCAAGGTGAATGTCGCGCGTTCGAATC
0
18.03.2021, 23:15

Теги

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