批量处理fasta文件时,删除含'n-----'行及其上一行出错求助
解决批量处理FASTA文件时的sed异常问题
我来帮你搞定这个批量处理FASTA文件的坑!你遇到的问题根源在于管道和sed -i原地修改的冲突,加上原脚本里的冗余操作,导致多文件处理时出现异常行。下面一步步给你拆解和解决:
问题分析
你原本的命令:
sed -i '' -n '/n-----/{s/.*//;x;d;};x;p;${x;p;}' FileName.fasta | sed '/^$/d'
在单个文件时能工作,但批量用*.fasta时出问题,原因有两个:
sed -i是原地修改文件,同时你又用管道把处理后的输出传给第二个sed——这会导致多文件的输出被混在一起处理,而非每个文件单独处理,进而产生额外的空行或错误行。- 原脚本里的
s/.*//是冗余操作,反而可能在缓冲区交换时引入空行,再加上管道后的空行删除逻辑,进一步打乱了处理流程。
修复后的批量处理命令
我们可以把两个sed的逻辑合并成一个脚本,直接原地批量修改所有FASTA文件,完全避免管道:
sed -i '' -n ' # 匹配到目标行时,删除上一行(存在保持空间)和当前行 /n-----/{x;d;} # 交换当前行和保持空间(把当前行暂存,准备打印上一行) x # 仅打印非空的上一行 /^$/!p # 处理文件最后一行,避免遗漏 ${x;/^$/!p} ' *.fasta
脚本逻辑详解
/n-----/{x;d;}:当遇到包含n-----的行时,交换保持空间(里面存的是上一行内容)到模式空间,然后执行d删除——这相当于同时删掉了目标行和它的上一行。x:交换模式空间(当前行)和保持空间,把当前行暂存到保持空间,模式空间变为上一行内容。/^$/!p:如果模式空间里的内容不是空行,就打印它(即打印上一行,除非上一行是空行)。${x;/^$/!p}:处理文件的最后一行时,交换保持空间(最后一行内容)到模式空间,非空则打印,避免最后一行被遗漏。
这个脚本既保留了你原本的需求(删除目标行及其上一行),又合并了空行删除的逻辑,同时完美支持批量处理所有*.fasta文件,不会出现异常行。
内容的提问来源于stack exchange,提问作者Damien Esquerre
相关产品推荐
相关产品推荐

