将第一个字段作为前缀添加到文本文件中所有其他字段的前缀

时间:2018-09-26 11:10:44

标签: linux bash text awk

我希望可以通过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 :(得分:1)

您可以尝试以下awk脚本:

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

该脚本从该行循环遍历所有字段(第一个字段除外),并将第一个字段添加到所有这些字段中。

答案 1 :(得分:1)

此单线应工作:

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