【问题标题】:Modifying text column wise with sed/awk使用 sed/awk 修改文本列
【发布时间】:2011-01-10 06:16:34
【问题描述】:

我有一个包含三列(制表符分隔)的输入数据,如下所示:

  a  mrna_185598_SGL 463
  b  mrna_9210_DLT   463
  c  mrna_9210_IND   463
  d  mrna_9210_INS   463
  e  mrna_9210_SGL   463

如何使用 sed/awk 将其修改为 四列数据如下所示:

a  mrna_185598 SGL   463
b  mrna_9210   DLT   463
c  mrna_9210   IND   463
d  mrna_9210   INS   463
e  mrna_9210   SGL   463

原则上我想将原始的“mrna”字符串分成两部分。

【问题讨论】:

    标签: linux unix sed awk text-processing


    【解决方案1】:

    傻瓜:

    {
      print $1 "\t" gensub(/_/, "\t", 2, $2) "\t" $3
    }
    

    【讨论】:

      【解决方案2】:

      类似的东西

      awk 'BEGIN{FS=OFS="\t"}{split($2,a,"_"); $2=a[1]"_"a[2]"\t"a[3] }1'  file
      

      输出

      # ./shell.sh
      a       mrna_185598     SGL     463
      b       mrna_9210       DLT     463
      c       mrna_9210       IND     463
      d       mrna_9210       INS     463
      e       mrna_9210       SGL     463
      

      在 Solaris 上使用 nawk

      如果你有 bash

      while IFS=$'\t' read -r a b c
      do
          front=${b%_*}
          back=${b##*_}
          printf "$a\t$front\t$back\t$c\n"
      done <"file"
      

      【讨论】:

        【解决方案3】:

        只要它们看起来与您发布的内容没有太大区别:

        sed -E 's/mrna_([0-9]+)_/mrna_\1\t/'
        

        【讨论】:

          【解决方案4】:

          您不需要使用 sed。而是使用 tr

          cat *FILENAME* | tr '_[:upper:]{3}\t' '\t[:lower:]{3}\t' >> *FILEOUT*
          

          cat FILENAME 将打印出文件,然后将通过管道('|')传送到 tr(翻译)。 tr 将替换任何具有下划线后跟 3 个大写字符,然后是制表符而不是下划线的制表符。然后它会将其附加到 FILEOUT

          【讨论】:

          • 无用的猫。将文件传递给 tr 。 --. tr 'blah 'blah' >文件输出。您是否正确测试了您的命令?
          【解决方案5】:
          $ cat test.txt
            a  mrna_185598_SGL 463
            b  mrna_9210_DLT   463
            c  mrna_9210_IND   463
            d  mrna_9210_INS   463
            e  mrna_9210_SGL   463
          
          $ cat test.txt | sed -E 's/(\S+)_(\S+)\s+(\S+)$/\1\t\2\t\3/'
            a  mrna_185598    SGL 463
            b  mrna_9210  DLT 463
            c  mrna_9210  IND 463
            d  mrna_9210  INS 463
            e  mrna_9210  SGL 463
          

          【讨论】:

          • 无用的猫。将文件名传递给 sed。 -- sed 'options' filename
          【解决方案6】:

          这可能对你有用(GNU sed):

          sed 's/_/\t/2' file
          

          将第二次出现的_ 替换为制表符。

          【讨论】:

            【解决方案7】:
            gawk '{$1=$1; $0=gensub(/_/,"\t",2);print}' file
            
            a mrna_185598   SGL 463
            b mrna_9210 DLT 463
            c mrna_9210 IND 463
            d mrna_9210 INS 463
            e mrna_9210 SGL 463
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-02-18
              • 1970-01-01
              • 2015-03-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-26
              相关资源
              最近更新 更多