linux - 提取文件中以相同模式开头的子字符串
问题描述
我有一个包含字符串的 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
解决方案
鉴于上面粘贴在文件中的三个示例行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
推荐阅读
- python - 访问列表中的特定按钮
- react-native - React Native 有条件地设置状态
- javascript - 将 jinja2 模板代码添加到 javascript innerHTML
- c++ - constexpr 使用标准库算法
- java - 遍历 Java 中的 autobox 类型列表
- ios - 如何限制对数据库的请求数
- c - 如何使这个依赖嵌套的并行版本,以及为什么崩溃不起作用
- angular - 如何在 Nx 中配置动态别名路径?
- java - 如何在数组中创建搜索方法
- python-3.x - 我想使用 Selenium 和 Python 打开一个特定的 Chrome 配置文件