【问题标题】:Delete Text between two strings sed, awk删除两个字符串之间的文本 sed, awk
【发布时间】:2015-11-10 09:34:20
【问题描述】:

我正在寻找解决方案,但找不到合适的解决方案。

我想删除每行两个字符串之间的所有字符。

输入是一个 Fasta 文件:

>CAM_P0000101_READ_00457523 /accession=CAM_P0000101_READ_00457523 /xy=2625_3790 /region=2 /run=R_2008_08_11_16_51_31_ /length=253 /sample_id=1309720343513924875 /sample_acc=CAM_P0000101_SMPL_PAPUT2 /sample_name=CAM_P0000101_SMPL_PAPUT2 /site_id_n=CAM_P0000101_SITE_PAPUT2
GTGCCTTCGGGAACCGGGTGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTCGTGAGATGTTGGGTTAAGTCCCGTAACGAGCGCAACCCTTGTCCTTAGTTGCCAGCACGTAATGGTGGGAACTCTAAGGAGACTGCCGGTGACAAACCGGAGGAAGGTGGGGACGACGTCAAGTCATCATGGCCCTTACGGCCTGGGCTACACACGTGCTACAATGGCTAGGACAGACGGCTGCAAACCNGCGAGTGGGG
>CAM_P0000101_READ_00460168 /accession=CAM_P0000101_READ_00460168 /xy=2199_0493 /region=2 /run=R_2008_08_11_16_51_31_ /length=233 /sample_id=1309720343513924875 /sample_acc=CAM_P0000101_SMPL_PAPUT2 /sample_name=CAM_P0000101_SMPL_PAPUT2 /site_id_n=CAM_P0000101_SITE_PAPUT2
TTTACCGCGGCTGCTGGCACGAAGTTAGCCGGACCTTATTCTTCGGGTACAGTCATTATCTTTCCCGACAAAAGAGCTTTACAACCCAAGGGCCTTCTTCACTCACGCGGCATCGCTGCATCAGGCTTTCGCCCATTGTGCAAGATTCCCCACTGCTGCCTCCCGTAGGAGTCTGGGCCGTATCTCAGTCCCAGTGTGGCTGATCATCCTCTACAAATCAGCTATTGATTACT

我想删除第一个>CAM_P*/sample_name=* 之后的所有文本以及sample_name.* 之后的所有文本

>CAM_* /sample_name=* 应该只保留这两件事。

所有这些都应该删除:

/accession=CAM_P0000101_READ_00457523 /xy=2625_3790 /region=2 /run=R_2008_08_11_16_51_31_ /length=253 /sample_id=1309720343513924875 /sample_acc=CAM_P0000101_SMPL_PAPUT /site_id_n=CAM_P0000101_SITE_PAPUT2

谁能帮帮我?

【问题讨论】:

  • 你的预期输出是什么?
  • 你为什么不直接print ">CAM_* /sample_name=*" 而不是为任何替换而烦恼?您有 2 行输入但只有 1 行输出 - 为什么?
  • GTGCCTTCGGGAACCG... 怎么样?您要删除还是保持原样?

标签: bash awk sed substitution


【解决方案1】:

这个怎么样:

sed 's/\(>CAM_P[^ ]*\).*\(\/sample_name=[^ ]*\).*/\1 \2/' filename

【讨论】:

    【解决方案2】:

    求救

    awk '{line=""; sep=""; p=q=0; 
          for(i=1;i<=NF;i++) {
              if(!p && $i~/CAM_P/) {
                  p=1;
                  line=line sep $i;
                  sep=FS
              } else if(!q && $i~/sample_name/) {
                  q=1;
                  line=line sep $i;
                  sep=FS
              }
           } 
           print line
          }'
    

    grep 的另一种选择

    grep -o ">CAM_P\w*\|/sample_name=\w*" filename | awk 'ORS=NR%2?FS:RS'
    

    只匹配两个单词并合并输出的两行

    【讨论】:

    • 谢谢,但我收到一条错误消息:
      awk -f short_name_fasta.awk test
      awk: short_name_fasta.awk:3: awk '{line=""; sep="";
      awk: short_name_fasta.awk:3: ^ invalid char ''' in expression
      awk: short_name_fasta.awk:3: awk '{line=""; sep="";
      awk: short_name_fasta.awk:3: ^ 语法错误
    • 脚本中不应包含awk,也不应包含单引号。请确认。仅包括单个引号之间的内容。或者,您的复制/粘贴可能从网页中抓取了一些无效字符。
    • 没问题。如果它是您正在寻找的,请接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2019-01-24
    • 2021-11-16
    • 2021-07-23
    • 2013-05-14
    相关资源
    最近更新 更多