我有一个巨大的文本文件,有点像这样:
=?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命令行调用它。
谢谢。
-
您可以像这样更新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
-
另一个简单的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