【问题标题】:Add first field as prefix to all other fields in line in a text file将第一个字段作为前缀添加到文本文件中的所有其他字段
【发布时间】:2019-03-02 03:38:51
【问题描述】:

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

【问题讨论】:

    标签: linux bash text awk


    【解决方案1】:

    你可以试试这个 awk 脚本:

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

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

    【讨论】:

    • 感谢 oliv,您的解决方案与上面的 Kent 具有相同的结果,即在每行末尾的附加字段中单独添加标识符。如果可以避免这种情况,那就完美了。
    • @DanPowell 我不明白你的意思。请更新您问题中的预期输出(以显示差异)。
    • @DanPowell 根据您对 Kent 回答的评论,您是否正在寻找类似这样的内容:awk '{end=NF+1;for(i=2;i&lt;=end;i++) $i=$1 " = " $i}1' OFS='\t' fileIhave.txt
    • 感谢 oliv,只要我删除了文件中的所有隐藏字符,您的原始解决方案也能完美运行。
    • @DanPowell 很高兴为您提供帮助。如果您觉得它有用,请考虑支持/接受此答案。
    【解决方案2】:

    这个单行应该可以工作:

    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
    

    【讨论】:

    • 太好了,谢谢肯特。虽然它在每种情况下都添加了前缀,但似乎在每行的末尾添加了一个额外的前缀。有没有办法防止这种情况发生?
    • @DanPowell 答案基于您有问题的示例数据。如果您的输入与示例不同,则可能会产生不同的结果。我看不到您的输入,所以我不知道结果如何以及如何解决。
    • 抱歉,我应该转贴输出:LOC107198162 LOC107198162 = GO:0016021 LOC107198162 = LOC107198170 LOC107198170 = GO:0004896 LOC107198170 = GO:0005515 LOC107198170 = GO:0016020 LOC107198170 = LOC107198182 LOC107198182 = GO:0016787 LOC107198182 = LOC107198203 LOC107198203 = LOC107198204 LOC107198204 = GO:0007160 LOC107198204 =
    • @DanPowell 您的真实文件必须与您给出的示例不同。文件中可能有一些不可见的字符。确保它们相同,否则我们很难帮助您解决问题。
    • 肯特你完全正确,有隐形字符。向你和@oliv 道歉,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2010-12-20
    • 2014-11-15
    相关资源
    最近更新 更多