首页 > 解决方案 > 提取文件中以相同模式开头的子字符串

问题描述

我有一个包含字符串的 fileA.txt:

>AMP_16 RS0247 CENPF__ENST00000366955.7__3251__30__0.43333__66.8488__1 RS0255
>AMP_16 RS0332 CENPF__ENST00000366955.7__2262__30__0.43333__67.9513__1 RS0451
>AMP_16 RS0332 CENPF__ENST00000366955.7__1108__30__0.43333__67.4673__1 RS0247
and so on .....

我想提取所有以 RS 输出开头的子字符串:

RS0247_RS0255
RS0332_RS0451
RS0332_RS0247

我试过这样的事情:

while read line
do
        for word in $line
        do
                if [[ "$word" =~ ^RS ]]
                then
                        [ -z "$str" ] && str="$word"
                fi
        done
done < fileA.txt

echo "$str" 

但是,当我回显时,我只打印出第一个字符串 RS0247

标签: linux

解决方案


鉴于上面粘贴在文件中的三个示例行f...

假设固定格式:

awk '{print $2"_"$4}' f
RS0247_RS0255
RS0332_RS0451
RS0332_RS0247

假设格式灵活(并且您只对前两次出现的以 开头的字段感兴趣RS

awk '{f=1;for (i=1;i<=NF;i++){if($i~/^RS/){a[f]=$i;f++}}print a[1]"_"a[2]}' f
RS0247_RS0255
RS0332_RS0451
RS0332_RS0247

编辑1:

并假设您希望修补自己的脚本而不是有效的解决方案:

#!/bin/bash
while read line
do
        str=""
        for word in $line
        do
                if [[ "$word" =~ ^RS ]]
                then
                        if [[ -z $str ]]
                        then
                                str=$word
                        else
                                str+="_${word}"
                        fi
                fi
        done
        echo "$str"
done < fileA.txt

编辑2:

在效率方面;我将这 3 行复制并粘贴到 fileA.txt 中 60 次(总共 180 行)。上述三个尝试按相同顺序的运行时间是:

  • 实际0m0.002s
  • 实际0m0.002s
  • 实际0m0.011s

推荐阅读