Добавить первое поле в качестве префикса ко всем другим полям в строке в текстовом файле - PullRequest
0 голосов
/ 26 сентября 2018

Я надеюсь, что это может быть легко решено с помощью awk, хотя я не смог справиться с этим.

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

fileIhave.txt:

LOC107198162    GO:0016021                          
LOC107198170    GO:0004896   GO:0005515  GO:0016020                 
LOC107198182    GO:0016787                          
LOC107198203                                
LOC107198204    GO:0007160          
...

У меня есть необходимость добавить / скопировать идентификатор (LOC *) для каждого из полей в соответствующей строке, включающих текст (GO: *) и добавить знак "=" между пробелами по обе стороны.то есть

fileIwant.txt

LOC107198162    LOC107198162 = GO:0016021                           
LOC107198170    LOC107198170 = GO:0004896    LOC107198170 = GO:0005515   LOC107198170 = GO:0016020                  
LOC107198182    LOC107198182 = GO:0016787                           
LOC107198203                                
LOC107198204    LOC107198204 = GO:0007160   
...

Я могу сделать это для второго поля (первое появление информации), используя awk 'BEGIN{OFS="\t"}$2=$1" = "$2', но не могу найти правильный способ примененияк дополнительным текстовым полям в строке.Также я не хочу копировать идентификатор в поле, если там нет текста.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Этот однострочник должен работать:

awk '{OFS="\t" $1" = ";$1=$1}7' file

тест с данными вашего примера (с использованием gawk):

kent$  awk '{OFS="\t" $1" = ";$1=$1}7 ' f
LOC107198162    LOC107198162 = GO:0016021
LOC107198170    LOC107198170 = GO:0004896       LOC107198170 = GO:0005515       LOC107198170 = GO:0016020
LOC107198182    LOC107198182 = GO:0016787
LOC107198203
LOC107198204    LOC107198204 = GO:0007160
0 голосов
/ 26 сентября 2018

Вы можете попробовать этот скрипт awk:

awk '{for(i=2;i<=NF;i++) $i=$1 " = " $i}1' OFS='\t' fileIhave.txt

Скрипт проходит по всем полям (кроме первого) в строке и добавляет первое поле ко всем из них.

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