我希望可以通过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'
在第二个字段(第一次出现信息)中执行此操作,但似乎找不到正确的方法来应用于该行中的其他文本字段。另外,如果那里没有文本,我也不想将标识符复制到字段中。
答案 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