如何为Bash循环添加条件:仅处理第2、4行不同的fasta文件
为Bash循环添加Fasta文件过滤条件
需求概述
原有的Bash循环会批量处理所有.fasta文件,现在需要添加判断逻辑:仅当目标fasta文件(固定为4行)的第2行与第4行序列不重复时,才执行parallel调用Python脚本的操作。
原循环命令:
for i in *.fasta ; do parallel -j 10 python script.py $i > $i.out done
解决方案
方法1:直接对比目标行内容
通过sed提取第2行和第4行,直接判断两行内容是否不同,逻辑直观高效:
for i in *.fasta; do # 提取文件的第2行和第4行内容 line2=$(sed -n '2p' "$i") line4=$(sed -n '4p' "$i") # 仅当两行内容不相等时执行后续命令 if [ "$line2" != "$line4" ]; then parallel -j 10 python script.py "$i" > "$i.out" fi done
方法2:通过去重行数判断
提取第2、4行后去重,统计剩余行数是否为2(说明两行无重复),适合需要扩展判断多行重复的场景:
for i in *.fasta; do # 提取目标行并去重,统计剩余行数 unique_line_count=$(sed -n '2p;4p' "$i" | uniq | wc -l) # 行数为2则说明两行不重复 if [ "$unique_line_count" -eq 2 ]; then parallel -j 10 python script.py "$i" > "$i.out" fi done
补充说明
- 两种方法都仅针对需要判断的行操作,比你之前尝试的
sort file.fasta | uniq -c更高效,无需处理整个文件。 - 给变量
$i添加双引号"$i",可避免文件名包含空格或特殊字符时出现执行错误。
内容的提问来源于stack exchange,提问作者SaltedPork
相关产品推荐
相关产品推荐

