【问题标题】:Modifying text within a file using sed or awk使用 sed 或 awk 修改文件中的文本
【发布时间】:2012-12-07 10:36:17
【问题描述】:

我正在尝试修改文件以打印第二列的一部分,并在其下一行显示相应的序列。我尝试了 awk、sed 和 grep,但我只得到了部分文本。

>hg19_ct_UserTrack_3545_(null) range=chr1:20802866-20802871 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GATAAG
>hg19_ct_UserTrack_3545_(null) range=chr1:23866529-23866534 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TTATCT
>hg19_ct_UserTrack_3545_(null) range=chr1:24345525-24345530 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GATAAG

chr1 20802866 20802871  GATAAG
chr1 23866529 23866534  TTATCT
chr1 24345525 24345530  GATAAG

【问题讨论】:

    标签: text sed awk editing


    【解决方案1】:
    awk -F'[=: -]' '/^>/{s=$3" "$4" "$5; next} {print s,$0}' file
    

    【讨论】:

      【解决方案2】:
      $ sed 'N; s/.*range=\([[:alnum:]]*\):\([[:digit:]]*\)-\([[:digit:]]*\).*\n\([[:alpha:]]*\)/\1 \2 \3 \4/' test.fa
      chr1 20802866 20802871 GATAAG
      chr1 23866529 23866534 TTATCT
      chr1 24345525 24345530 GATAAG
      

      【讨论】:

      • @user1879573 No problem,顺便说一句,如果它解决了你的问题,你可以将答案标记为accepted
      【解决方案3】:

      另一种解决方案:

      awk -F "[=: -]" '{getline a; print $3,$4,$5,a}' file
      

      【讨论】:

      • 以上不是getline的安全或适当使用。在您阅读并完全理解 awk.info/?tip/getline 之前,请勿使用 getline。
      • @Ed Morton,你能解释一下为什么我的例子不正确吗?谢谢。
      • 我写了那篇文章,这样我和其他人就不必一直解释它了。一旦你理解了那篇文章,你就不会再像这样使用 getline 了。 getline 是一个有用的工具,但 awks 的主要功能是读取文件中的每一行并对每一行应用条件/操作规则,因此使用 getline 来规避这种行为有点像骑自行车。
      • @Ed Morton,你是对的。我只会将 getline 用作最后的手段。
      • 关键是在适当的时候使用它。那篇文章显示了一个非常完整的列表,说明了何时适合使用 getline,以及在这些情况下使用它时它是一个非常宝贵的工具。
      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 2013-01-26
      • 2013-02-18
      • 2011-01-10
      • 1970-01-01
      • 2014-02-02
      • 2016-10-13
      相关资源
      最近更新 更多