Разверните строки с несколькими записями данных в отдельные строки с одним фрагментом данных каждый - PullRequest
0 голосов
/ 03 февраля 2019

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

Например:

SOAP.k35.scaffold280 0003723 
SOAP.k35.scaffold421 
SOAP.k35.scaffold429 0004930 0016021
TRINITY_DN23171_c1_g1_i2 0006457 0005509 0030246 0051082 0005788
SOAP.k35.scaffold599 0007411 0033627 0035001 0016321 0007507 0035011 0007498 0045886 0030155 0030334 0045995 0034446 0005102 0030424 0005604 0030054 0036062 0008021

Я бы хотел, чтобы каждая запись конечных цифр содержалась в отдельной строке с соответствующим идентификатором первого столбца (т. Е. SOAP ... или TRINITY ....)в начале каждой строки добавляется знак «=» между идентификатором первого столбца и указанным номером для этой строки.Я также хотел бы удалить строки, которые не содержат цифр после идентификатора первого столбца.

В качестве примера того, каким должен быть результат обработанного текста выше:

SOAP.k35.scaffold280 = 0003723
SOAP.k35.scaffold429 = 0004930
SOAP.k35.scaffold429 = 0016021
TRINITY_DN23171_c1_g1_i2 = 0006457
TRINITY_DN23171_c1_g1_i2 = 0005509
TRINITY_DN23171_c1_g1_i2 = 0030246

... и т. Д.

Моя основная проблема заключается в знаниикак сохранить этот идентификатор первого столбца для вставки перед любыми символами новой строки, которые я вставляю при разборе строк по числовым данным.

Любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

просто,

$ awk '{for(i=2;i<=NF;i++) print $1,"=",$i}' file

SOAP.k35.scaffold280 = 0003723
SOAP.k35.scaffold429 = 0004930
SOAP.k35.scaffold429 = 0016021
TRINITY_DN23171_c1_g1_i2 = 0006457
TRINITY_DN23171_c1_g1_i2 = 0005509
TRINITY_DN23171_c1_g1_i2 = 0030246
TRINITY_DN23171_c1_g1_i2 = 0051082
TRINITY_DN23171_c1_g1_i2 = 0005788
...
0 голосов
/ 04 февраля 2019

Вы также можете попробовать Perl

$ perl -ne ' ($x)=$_=~m/(^\S+)/; while( /\s(\d+)/g ) { print "$x = $1\n" } ' scottc.txt
SOAP.k35.scaffold280 = 0003723
SOAP.k35.scaffold429 = 0004930
SOAP.k35.scaffold429 = 0016021
TRINITY_DN23171_c1_g1_i2 = 0006457
TRINITY_DN23171_c1_g1_i2 = 0005509
TRINITY_DN23171_c1_g1_i2 = 0030246
TRINITY_DN23171_c1_g1_i2 = 0051082
TRINITY_DN23171_c1_g1_i2 = 0005788
SOAP.k35.scaffold599 = 0007411
SOAP.k35.scaffold599 = 0033627
SOAP.k35.scaffold599 = 0035001
SOAP.k35.scaffold599 = 0016321
SOAP.k35.scaffold599 = 0007507
SOAP.k35.scaffold599 = 0035011
. . . . . 
. . . . . 
0 голосов
/ 03 февраля 2019

Не могли бы вы попробовать следующее.

awk '(/^SOAP/ || /^TRINITY/){for(i=2;i<=NF;i++){print $1" = "$i}}' Input_file

Если вы не хотите строго awk программировать только для строк, которые начинаются со строки SOAP или TRINITY, тогда попробуйте выполнить следующее.

awk '{for(i=2;i<=NF;i++){print $1" = "$i}}' Input_file

Вывод будет следующим.

SOAP.k35.scaffold280 = 0003723
SOAP.k35.scaffold429 = 0004930
SOAP.k35.scaffold429 = 0016021
TRINITY_DN23171_c1_g1_i2 = 0006457
TRINITY_DN23171_c1_g1_i2 = 0005509
TRINITY_DN23171_c1_g1_i2 = 0030246
TRINITY_DN23171_c1_g1_i2 = 0051082
TRINITY_DN23171_c1_g1_i2 = 0005788
SOAP.k35.scaffold599 = 0007411
SOAP.k35.scaffold599 = 0033627
SOAP.k35.scaffold599 = 0035001
SOAP.k35.scaffold599 = 0016321
SOAP.k35.scaffold599 = 0007507
SOAP.k35.scaffold599 = 0035011
SOAP.k35.scaffold599 = 0007498
SOAP.k35.scaffold599 = 0045886
SOAP.k35.scaffold599 = 0030155
SOAP.k35.scaffold599 = 0030334
SOAP.k35.scaffold599 = 0045995
SOAP.k35.scaffold599 = 0034446
SOAP.k35.scaffold599 = 0005102
SOAP.k35.scaffold599 = 0030424
SOAP.k35.scaffold599 = 0005604
SOAP.k35.scaffold599 = 0030054
SOAP.k35.scaffold599 = 0036062
SOAP.k35.scaffold599 = 0008021
...