Команда Unix fold ведет себя странно

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

В качестве более конкретного примера, вот отрывок из вывода ip link showна одной из моих систем, где я запускаю кучу виртуальных машин:

6: br0:  mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether fe:20:b5:bd:42:4b brd ff:ff:ff:ff:ff:ff
7: tap0:  mtu 1500 qdisc pfifo_fast aster br0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether fe:98:c5:54:95:2a brd ff:ff:ff:ff:ff:ff
8: tap1:  mtu 1500 qdisc pfifo_fast aster br0 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether fe:97:56:bf:0c:81 brd ff:ff:ff:ff:ff:ff

В этой системе интерфейс программного моста br0служит сегментом сети, к которому подключаются все виртуальные машины, обеспечивая функциональные возможности, эквивалентные аппаратному сетевому коммутатору.Каждый из tapинтерфейсов автоматически создается QEMU для каждой виртуальной машины, которую я запускаю (Я перечислил здесь только два таких интерфейса, но у меня регулярно есть по крайней мере дюжина ), когда я использую опцию -net bridgeдля QEMU и действует как кабель, соединяющий виртуальную сетевую карту ()в виртуальной машине с интерфейсом моста. В данном конкретном случае у меня фактически нет никакого физического оборудования, подключенного к этому интерфейсу моста (, так что это то, что иногда называют «плавающим» или «виртуальным» мостом ), и вместо этого я использую правила маршрутизации в хост-системе для обеспечить доступ к внешней сети для виртуальных машин. Если бы я хотел изолировать пару виртуальных машин от остальных, я мог бы легко создать новый мостовой интерфейс и указать QEMU подключить их к нему вместо br0.

В вашем случае, основываясь на тегах вопроса, вы, похоже, хотите использовать VirtualBox, который имеет аналогичную функциональность с адаптерами «Внутренняя сеть» и «Только хост -». Первый работает так же, как настройка моста, о которой я говорил выше, за исключением того, что сам VirtualBox предоставляет мост вместо ОС, и он предоставляет возможность действовать как DHCP-сервер. Второй — это буквально точка -— точка -между виртуальной машиной и хост-системой. это не очень полезно для экспериментов с низкоуровневой -конфигурацией, но очень полезно для экспериментов с VPN (, поскольку ссылка идет только на хост, вы можете быть уверены, что любые две виртуальные машины общаются только по VPN-каналу ). ].

Теперь, хотя все это прекрасно подходит для экспериментов с конфигурацией сети, это не самый эффективный вариант. В зависимости от точных особенностей типа эксперимента, который вы хотите провести, вы можете обнаружить, что либо Open vSwitch , либо ns -3 лучше подходят для того, что вы хотите сделать..

6
24.01.2020, 23:22
3 ответа

Ваша проблема не связана с кодировкой вашего файла. Утилита foldдовольно примитивна и разбивает строки на определенную длину, но не соединяет строки.

Вы также можете быть осторожны с сохранением строк заголовков fasta такими, как они есть (т. е. не сворачивать эти ).


awk -v W=50 '
    /^>/ { if (seq != "") print seq; print; seq = ""; next }
    {
        seq = seq $1
        while (length(seq) > W) {
            print substr(seq, 1,W)
            seq = substr(seq, 1+W)
        }
    }
    END { if (seq != "") print seq }' file.fa

Эта команда awkпереформатирует вашу последовательность до 50 символов, оставив нетронутыми строки заголовка. Ширина 50 настраивается с помощью переменной Wи может быть установлена ​​на любое положительное целое число.

Первый блок в коде обрабатывает строки заголовков и выводит накопленный бит последовательности из предыдущей последовательности, если таковой остался для вывода, перед передачей строки заголовка без изменений на выход.

Второй блок накапливает строку последовательности и, возможно, выводит накопленную последовательность, если она достаточно длинная, в соответствующих фрагментах.

Последний блок(END)выводит любую оставшуюся -избыточную последовательность при достижении конца ввода.

Запустив это на файле, состоящем из двух копий вашей последовательности, вы получите

>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC

Изменение Wна 30 дает

>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATC
AAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAA
TCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATC
GGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCC
GGATAGATAAAAATAAACAC
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATC
AAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAA
TCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATC
GGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCC
GGATAGATAAAAATAAACAC

Вас также может заинтересовать FASTX -Toolkit от CSHL. Я никогда не использовал это сам, но, похоже, он включает «Форматтер FASTA (изменяет ширину строки последовательностей в файле FASTA )». Последний выпуск инструментов от 2014 года (довольно старый ), поэтому вы можете скомпилировать их самостоятельно из исходного кода, а не использовать один из предоставленных предварительно скомпилированных двоичных файлов, если только ваш конкретный дистрибутив Unix не предоставляет проверку пакета (ваш репозиторий пакетов ).

5
27.01.2020, 20:24

Именно так работает fold.Вы никогда раньше не заполняли его, потому что раньше у вас не было строк такой длины. Сворачивание происходит по каждой строке отдельно. Итак, если длина строки не является точным кратным размеру, до которого вы сворачиваете, вы получите такой вывод. Например:

$ perl -le 'for (0..2){print "A" x 12}' 
AAAAAAAAAAAA
AAAAAAAAAAAA
AAAAAAAAAAAA
$ perl -le 'for (0..2){print "A" x 12}' | fold -w 6
AAAAAA
AAAAAA
AAAAAA
AAAAAA
AAAAAA
AAAAAA
$ perl -le 'for (0..2){print "A" x 12}' | fold -w 7
AAAAAAA
AAAAA
AAAAAAA
AAAAA
AAAAAAA
AAAAA

На самом деле это не проблема. Это все еще действующий файл fasta, но он не очень красивый. В качестве обходного пути вы можете взять скрипты FastaToTblи TblToFasta, которые я разместил ранее , и выполнить:

$ FastaToTbl input.fasta | TblToFasta 
>m64093_191209_130050/133911/ccs_64 
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC

Скрипт TblToFastaгарантирует, что выходные данные будут стандартными 60bp на строку. Если вам действительно нужно 50 вместо этого, вы можете сделать (это предполагает GNUsed):

$ FastaToTbl input.fasta | sed -E 's/^/>/;s/\t/\n/ ' | sed -E 's/(.{50})/\1\n/g'
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
2
27.01.2020, 20:24

попробуй это:

<input.fasta tr -d '\n'|fold -w 50 >output.fasta

При этом используется trдля удаления существующих концов -из -строк, а затем форматируется результирующая одна строка в несколько строк, каждая из которых имеет максимальную длину 50.

Чтобы сохранить текущую длину первой строки и не объединять ее со следующими строками, это должно работать (и завершает вывод концом -строки -):

awk '{if (NR==1) {print $0 gensub(/ /, " ", "g", sprintf("%*s", 50-length($0), ""))} else print $0}' input.fasta|tr -d '\n'|sed '$s/$/\n/'|fold -w 50|awk '{$1=$1};1' >output.fasta
2
27.01.2020, 20:24

Теги

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