【问题标题】:extract multiple items on single line using grep/sed/perl使用 grep/sed/perl 在单行中提取多个项目
【发布时间】:2018-02-08 17:32:53
【问题描述】:

我有一个有点像这样的大文本文件:

=?accession=P12345;=?position=999;
=?accession=Q19283;=?position=777;
=?accession=A918282;=?position=888;

我想提取accession=; 之间的术语,然后还要提取position=; 之间的术语

所以我得到:

P12345 999
Q19283 777
A918282 888

我需要在它们之间进行 grep 的字符串变得更加复杂,所以我想一个硬编码的解决方案。

我知道我可以采用“两个字符串之间的 grep”方法:

grep -Po 'accession= \K.*(?= ;)'

但我不知道如何从输入的同一行获取后续提取,以便与输出出现在同一行。

我真的不介意这是如何完成的,只要我可以从 linux 命令行调用它。

谢谢。

【问题讨论】:

  • 如果您向我们展示的样本只是a bit like 您的真实数据,我们如何帮助您想出一个脚本来解析您的数据?这感觉就像我们要剥洋葱一段时间才能达到您的真正要求。

标签: linux bash perl sed tr


【解决方案1】:

这个awk 应该可以工作:

awk -F ';' '{gsub(/=[^=]*=/, ""); $1=$1} 1' file

P12345 999
Q19283 777
A918282 888

【讨论】:

    【解决方案2】:
    sed -r 's/.*accession=([^;]*);.*position=([^;]*).*/\1 \2/' textfile
    

    【讨论】:

      【解决方案3】:

      这个 perl 单行代码

      perl -wnE'say join " ", /(?:accession|position)=([^;]+)/g' input.txt
      

      打印所需的输出。

      【讨论】:

        【解决方案4】:
        1. 您可以像这样更新您的 grep 表达式。

          grep -oP "(accession=\K\w+)|(position=\K\d+)" file
          

          输出:

          P12345
          999
          Q19283
          777
          A918282
          888
          

          要按照您想要的方式格式化,请使用paste

          grep -oP "(accession=\K\w+)|(position=\K\d+)" file | paste -d ' ' - -
          

          输出:

          P12345 999
          Q19283 777
          A918282 888
          
        2. 另一个简单的 awk 解决方案:

          awk -F"=|;" '{print $3, $6}' file
          

          输出:

          P12345 999
          Q19283 777
          A918282 888
          

        【讨论】:

        • @brucezepplin:您可以按照此处所述稍微修改您的 grep。干杯!
        • 非常感谢 - 粘贴命令是关键,\K\w+ 很简洁。谢谢。
        • 很高兴我能帮上忙。 :) 欢迎 ^_^
        • 太棒了!为了使它成为一个更强有力的答案,可能会考虑在粘贴命令周围添加一些解释(是的,人们可以通过 rtfm 来理解为什么两个连字符,但可以在此处包含该信息以节省额外的谷歌搜索:))
        猜你喜欢
        • 2015-06-11
        • 1970-01-01
        • 2013-09-09
        • 2018-10-10
        • 2013-11-12
        • 1970-01-01
        • 2011-07-05
        • 2012-10-25
        • 2012-08-02
        相关资源
        最近更新 更多