![删除许多文件上的变量字符串](https://linux22.com/image/137862/%E5%88%A0%E9%99%A4%E8%AE%B8%E5%A4%9A%E6%96%87%E4%BB%B6%E4%B8%8A%E7%9A%84%E5%8F%98%E9%87%8F%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有许多包含类似字符串的文件:
>33100_Pseudomonas_etcetera1
texttexttext
>33632_Pseudomonas_etcetera2
texttexttext
>36406_Pseudomonas_etcetera3
texttexttext
我需要这样的输出:
>Pseudomomas_etcetera1
texttexttext
>Pseudomomas_etcetera2
texttexttext
>Pseudomomas_etcetera3
texttexttext
很确定有一个简单的 sed 解决方案,我似乎无法弄清楚
注意:字符始终是五个数字,后跟下划线,后跟假单胞菌等。该字符串始终位于其行的开头,并且始终以“>”开头。所有文件都有一个“.sorted”扩展名。
答案1
sed
可以:
sed -E 's/>([0-9]+_)(\w+)/>\2/' files
如果您的模式完全有问题:
sed -E 's/([0-9]+_)//' files
-E
使用扩展正则表达式([0-9]+_)(\w+)
定义两个字型您访问它们的区域\1和\2。
答案2
使用 standard sed
,并假设所有文件都位于当前目录中:
mkdir fixed || exit 1 # exits if the output directory already exists
for filename in *.sorted; do
sed '/^>[0-9]*_/s//>/' "$filename" >"fixed/$filename"
done
这将迭代与模式匹配的所有文件名*.sorted
,并为每个文件名运行一个简短的sed
脚本。
该sed
脚本将找到所有以数字开头后跟下划线的 Fasta 标头。当它找到一个时,它将仅用标题标记替换标题标记、数字和下划线>
。
结果将写入fixed
子目录中的新文件中。
答案3
[OP 写道] 很确定有一个简单的 sed 解决方案,我似乎无法弄清楚。
那是对的。
[OP 写道] 注意:字符始终是五个数字,后跟下划线,后跟 Pseudomonas_etcetera。该字符串始终位于其行的开头,并且始终以“>”开头。所有文件都有一个“.sorted”扩展名。
您对 pbm 语句的描述非常准确,因为它可以有效地转换为sed
代码。就是这样:
- 该字符串始终位于行的开头,并且始终以 ">" 开头: regex =>
/^>/
- 字符始终为 5 个数字字符:regex =>
/^>[0-9][0-9][0-9][0-9][0-9]/
- 后跟下划线,后跟“Pseudomonas_etcetera”:regex =>
/^>[0-9][0-9][0-9][0-9][0-9]_Pseudomonas_etcetera/
- 中的替换命令的基本语法
sed
是:s/regex/rpl_str/
,这意味着模式空间的任何部分(通常是当前行,也称为记录)与正则表达式匹配(在命令LHS
的前面s///
,将被替换为命令RHS
的s///
。 - 所以你执行替换的命令是:
sed -e 's/^>[0-9][0-9][0-9][0-9][0-9]_Pseudomonas_etcetera/>Pseudomonas_etcetera/' inp1.sorted
- 免责声明:未经测试。