Развертывание одной строки на две строки на основе определенных столбцов

У меня есть файл .tsv ( batch_1.catalog.tags.tsv ), состоящий из 1 965 056 строк из 14 столбцов . Я хочу разбить некоторые из них на две строки .

Первая строка : начинается с знака больше (>), за которым следуют 8 из 14 столбцов
Вторая строка : только столбец 10

Например.

 >column3(a number) column4(numbers and letters) column5(a number) column6(- or +) column11(0 or 1) column12(0 or 1) column13(0 or 1) column14(0 or 1) column10(string with As,Ts,Gs,Cs, and sometimes Ns) 

Ниже приведен пример шестой строки файла .tsv , как указано в третьем столбце:

 0 1 6 gi|586799556|ref|NW_006530744.1| 141 + consensus 0 1_33,14_43 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 0 0 0 0 

Это то, что я хотел бы:

 >6 gi|586799556|ref|NW_006530744.1| 141 + 0 0 0 0 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 

Тем не менее, я хочу сделать это только в строках в файле tsv (batch_1.catalog.tags.tsv), который имеет номер третьего столбца, который соответствует номерам в другом текстовом файле (whitelist.txt).

В приведенном выше примере файл whitelist.txt будет содержать число 6, хотя имеется еще 8000 строк с разными номерами третьего столбца (т.е. идентификаторы). В whitelist.txt входят номера до 6 цифр.

Я пытаюсь использовать альтернативный подход. Мне был предоставлен код ниже, чтобы использовать белый список, чтобы вытащить столбец 10 из файла .tsv . Однако grep продолжал 10 часов и ничего не делал (пустой файл cat.fa ).

 cat whitelist.txt | while read line; do zgrep "^0 1 $line " batch_1.catalog.tags.tsv.gz; done | cut -f 3,10 | sed -E -e's/^([0-9]+) ([ACGTN]+)$/>\1Z\2/' | tr "Z" "\n" > cat.fa 

Оба решения ниже, используя awk или perl, работают отлично. Идентификаторы также распечатываются в порядке, хотя они не были в порядке в белом списке. Решение perl печатает строки с разделителями табуляции, в то время как awk печатает их с разделителями в пространстве.

2 Solutions collect form web for “Развертывание одной строки на две строки на основе определенных столбцов”

Решение awk :

Предположим, что тестовый фрагмент из файла batch_1.catalog.tags.tsv :

 0 1 6 gi|586799556|ref|NW_006530744.1| 141 + consensus 0 1_33,14_43 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 0 0 0 0 1 2 7 hi|686711556|ref|NW_006530744.2| 141 + consensus 0 1_33,14_43 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 1 1 0 1 2 2 8 hi|686711556|ref|NW_006530744.2| 141 + consensus 0 1_33,14_43 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 1 1 1 1 3 3 9 th|776711556|ref|NW_006530744.2| 141 + consensus 1 1_33,14_43 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 1 0 1 1 

И тестовый фрагмент из файла whitelight.txt :

 6 7 9 

Команда:

 awk 'NR==FNR{ a[$0]++; next }{ if ($3 in a) { $0=">"$3 FS $4 FS $5 FS $6 FS $11 FS $12 FS $13 FS $14 RS $10; print}}' whitelist.txt batch_1.catalog.tags.tsv > cat.fa 

cat.fa содержание cat.fa :

 >6 gi|586799556|ref|NW_006530744.1| 141 + 0 0 0 0 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC >7 hi|686711556|ref|NW_006530744.2| 141 + 1 1 0 1 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC >9 th|776711556|ref|NW_006530744.2| 141 + 1 0 1 1 CGGGCGGTGGTGGCGCACGCCTTTAATCCCAGCACTTGGGAGGCAGAGGCAGGTGGATCTTTGTGAGTTCGAGGCCAGCCTGGGCTACCAAGTGAGCTCC 

Детали :

NR==FNR – выполнить действие для первого файла, т.е. whitelight.txt

a[$0]++; – накопление чисел из файла whitelight.txt

if ($3 in a) – разрешает действие, если значение третьего столбца из второго файла соответствует любому из накопленных номеров

RS awk разделитель записей, по умолчанию используется символ новой строки

 perl -F'\t+' -lane ' @ARGV and $h{$F[0]}++,next; print ">", join("\t", @F[2..5,-4..-1]), $\, $F[9] if exists $h{$F[2]}; ' whitelist.txt batch_1.catalog.tags.tsv 

Предположим, что ваш файл разделен на TAB.

Обратите внимание, что если у вашего файла могут быть окончания окон или Mac, тогда разумно сначала преобразовать их в конец строки unix («\ n») с помощью утилиты dos2unix и т. Д. Coz много раз видели, что предоставленный код не работа в конце OP из-за таких причин.

Разработки

  • Обратите внимание, что Perl обрабатывает первый аргумент (в этом случае whitelight.txt , тогда @ARGV хранит файл batch_1.catalog.tsv , то есть @ARGV = 1 => @ARGV оценивается как TRUE в булевом контексте.
  • @ARGV and $h{$F[0]}++,next должен интерпретироваться как: когда мы обрабатываем файл whitelight, добавьте первое поле ( $F[0] ) этого файла в хэш %h то сразу перейдите к следующей строке.
  • Любые строки под ними обрабатывают TSV-файл, так как в то время @ARGV ничего не держит, поэтому счет равен нулю.
  • Только те записи TSV-файлов должны иметь stdout, у которых есть 3-е поле $F[2] , являющееся ключом в хеше %h .
  • После того, как было принято решение распечатать запись TSV, формат для ее печати: (Примечание: значение OFS для печати по умолчанию равно NULL )
  • ">" , $F[2] означает, что третьему полю предшествует a >
  • поля 4,5,6 => @F[3..5] будут разделены и объединены TAB.
  • последние 4 поля => @F[-4..-1] будут разделены и объединены TAB.
  • Десятому полю $F[9] будет предшествовать новая строка, предоставляемая $\ = ORS = \n из-за параметра Perl -l .
  • Добавление запятых между элементами двоичной матрицы в текстовом файле
  • удалить ведущую строку в bash
  • извлекать блоки текста из XML-файла
  • Команда Shell для удаления первой строки, заключенной с косой чертой
  • Регулярные выражения для дезинфекции телефонных номеров
  • Как экспортировать данные в терминал в файл (например, файл csv)
  • bash расширяется до того же значения вместо значения строки за строкой в ​​команде sed
  • команда sed unterminated `s
  • Как совместить точную строку с помощью `sed`? Но не его часть.
  • Как манипулировать CSV-файлом с помощью sed или awk?
  • Удалить все узлы <FOLDER>! = Значение тега
  • Linux и Unix - лучшая ОС в мире.