使用grep/sed/perl在一行中提取多个项目



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

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

我想提取accession=;之间的项,然后还提取position=;之间的项

所以我得到:

P12345 999
Q19283 777
A918282 888

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

我知道我可以采取"两个字符串之间的grep"方法:

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

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

我真的不介意怎么做,只要我能从linux命令行调用它。

谢谢。

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

    grep -oP "(accession=Kw+)|(position=Kd+)" file
    

    输出:

    P12345
    999
    Q19283
    777
    A918282
    888
    

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

    grep -oP "(accession=Kw+)|(position=Kd+)" file | paste -d ' ' - -
    

    输出:

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

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

    输出:

    P12345 999
    Q19283 777
    A918282 888
    

这个perl一行

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

打印所需的输出。

这个awk应该工作:

awk -F ';' '{gsub(/=[^=]*=/, ""); $1=$1} 1' file
P12345 999
Q19283 777
A918282 888
sed -r 's/.*accession=([^;]*);.*position=([^;]*).*/1 2/' textfile

最新更新