使用 grep/sed/perl 在单行上提取多个项目

bru*_*lin 3 linux bash perl sed tr

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

=?accession=P12345;=?position=999;
=?accession=Q19283;=?position=777;
=?accession=A918282;=?position=888;
Run Code Online (Sandbox Code Playgroud)

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

这样我就得到:

P12345 999
Q19283 777
A918282 888
Run Code Online (Sandbox Code Playgroud)

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

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

grep -Po 'accession= \K.*(?= ;)'
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使输入的同一行中的后续提取也出现在与输出的同一行上。

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

谢谢。

Rah*_*rma 6

  1. 您可以像这样更新grep表达式。

    grep -oP "(accession=\K\w+)|(position=\K\d+)" file
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    P12345
    999
    Q19283
    777
    A918282
    888
    
    Run Code Online (Sandbox Code Playgroud)

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

    grep -oP "(accession=\K\w+)|(position=\K\d+)" file | paste -d ' ' - -
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    P12345 999
    Q19283 777
    A918282 888
    
    Run Code Online (Sandbox Code Playgroud)
  2. 另一个简单的awk解决方案:

    awk -F"=|;" '{print $3, $6}' file
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    P12345 999
    Q19283 777
    A918282 888
    
    Run Code Online (Sandbox Code Playgroud)

  • 极好的!为了使这个答案更加有力,可以考虑在该粘贴命令周围添加一些解释(是的,人们可以通过 rtfm 来理解为什么有两个连字符,但可以在此处包含该信息以节省额外的谷歌搜索:)) (2认同)