【问题标题】:awk split and reverse the orderawk 拆分并反转​​顺序
【发布时间】:2021-10-12 18:23:03
【问题描述】:

我有以下以制表符分隔的行。

NIATv7_g10470.t1    XP_019227081.1  100.0   878 0   0   1   878 1   878 0.0e+00 1599.7  99.9    MELKVSSPKPVFSTSDCNSDPEEKEISEDXXXXXXXXXXXXXTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRXXXXXXXXXXXXXXXXXXXXXKQAVGVKDEAAPDQAMNKPKGGGTVSNSGXXXXXXXXXXXXXXXXXXXXXXXXXSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE  MELKVSSPKPVFSTSDCNSDPEEKEISEDXXXXXXXXXXXXXTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRXXXXXXXXXXXXXXXXXXXXXKQAVGVKDEAAPDQAMNKPKGGGTVSNSGXXXXXXXXXXXXXXXXXXXXXXXXXSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE  MELKVSSPKPVFSTSDCNSDPEEKEISEDXXXXXXXXXXXXXTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRXXXXXXXXXXXXXXXXXXXXXKQAVGVKDEAAPDQAMNKPKGGGTVSNSGXXXXXXXXXXXXXXXXXXXXXXXXXSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE* MELKVSSPKPVFSTSDCNSDPEEKEISEDDDDDRNHKHRRKDTRSQSTETEALEPALRRPFRKRNKPFENGHPYQEGDSHSSDTRFGKRRGMGSFSRTPSDSYQMMRLNQSLSGHAAPGRGRGRESGAWGPCESRFSTIDIASQFVPQGPINPLLYTGRGPQNVSSGQGASWNAFGIVPGIPNGGLDTLHTLGLQGRLRTSLNPAMSMGIPRQRCRDFEERGFCLRGDMCPLEHGVNRIVVEDVQSLSKFNLPVSLPGAHTLGPATAQGPLPAISPSSSLANKALHNKSINPPVIDNGLGLTDTFGGGSVSGGADFYDPDQPLWSNDHPENSAALLDVNRSKIDDTGPMLDADSSDQDQVALCDGFKLERLVRDAGAASGSQSVWERTSRSKHKLQSFNSTQGINRHGKQTNVDTIDPQMVESSSEPQSSSGRNMRKPSQKALRTLFVSGVPQKDNKPEALLSHFQKFGEVIDIYIPMNGERAFVQFSKREEAEAALKAPDAVMGNRFIKLFWANRDSIMDNGTSGSSIFPLAPRGGTPSTVPPHLLFPHKRKDNLQTVAGKTAEQACGSVTVAPLATSDLPKPVAQNGLKTTPPLKKKLETLELLKEEMRKKQEMLEQKRNEFRRKLDKLEKQAVGVKDEAAPDQAMNKPKGGGTVSNSGKVENSSPVEPSNTVSSPPSEATPDSSRSTENAEPTCSKLSLTVAMHEASNLKQSIRPLAPVGAPFILNRYKLDNRPTTFKILPPLPSALANVDVLKEHFSTFGDPPSVELEDLEPKDCNDGSEVQNTSARISFRSRRSAERAFLNGKSWQGQILQLMWVQSSNPAKDVGVGENVTPASKQPSDANGQSNARNGVAGLPEGSVAGNHEPDNQGRREDE  XP_019227081.1 PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]

我使用这个 awk 命令来简化上面的行:

> awk 'BEGIN { FS = "\t" } ;{print $1","$18}' NIATT_r2.0.aa.combined_nr_XPonly.best_hit_addNoXP | head
NIATv7_g10470.t1,XP_019227081.1 PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]

我想将$18 拆分为第一个空格。

XP_019227081.1 PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]

我想交换这个拆分的输出并用制表符分隔。

PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]   XP_019227081.1 

作为最终结果,我想将$1 与反向拆分结果组合以实现以下输出:

NIATv7_g10470.t1,PREDICTED: zinc finger CCCH domain-containing protein 41-like [Nicotiana attenuata]       XP_019227081.1 

这怎么可能?

【问题讨论】:

  • 看起来您的原始文件由空格和制表符的组合分隔。只需将FS 设置为默认值(不要设置它),它将在 whitespace 上中断,包括空格或制表符。例如,使用默认的$1 是NIATv7_g10470.t1 和$18 是XP_019227081.1($19 是PREDICTED:)
  • 抱歉,我更新了问题中的输入文件。
  • 你能不能用简单的英语说你想要什么,这样我就不必一直滚动到日本并记住 20 个奇怪的(对我而言)字段。谢谢。
  • 您要的是这样的东西吗? awk '{print $1","$19,$20,$21,$22,$23,$24,$25,$26,$NF"\t\t"$18}'
  • 对不起,让您感到困惑。我更新了我的问题。

标签: awk


【解决方案1】:

如果你使用 GNU awk,加上 gensub 扩展,你可以试试:

awk -F'\t' '{print $1 "," gensub(/(\S+)\s+(.*)/, "\\2\t\\1", "1", $18)}'

【讨论】:

    【解决方案2】:

    split 函数允许您在任意正则表达式上拆分值。

    awk -F '\t' '{ split($18, fields, / /);
        print $1 "," substr($18, length(fields[1]) + 2) "\t" fields[1]  }' NIATT_r2.0.aa.combined_nr_XPonly.best_hit_addNoXP
    

    或者,您可以使用 sub()(或在支持它的 Awk 方言中,gsub())直接对值执行正则表达式替换。

    【讨论】:

    • 感谢您的解决方案,但它不会交换拆分。
    • 糟糕,现已修复。
    猜你喜欢
    • 2020-07-09
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多