【发布时间】:2012-01-21 07:14:18
【问题描述】:
以下是我需要处理的文件格式:
@HWI-ST150_0129:2:1:4226:2616#0/1
CATCTTTTCTCTTAACTTCCATGATGGTACATCTTTTGATTTTTTTTTAATAACGTCTTTGACAGCTTAAATTCTTTTTCAAAATC
+HWI-ST150_0129:2:1:4226:2616#0/1
d\dddddaddbcad^\^a\]ZZZ_`]\VYa_bZ^_^\YX\X`eeeeffffffefffeeefffefffeeffBBBBBBBBBBBBBBBB
基本上我需要做的是: 1.每4行挑出一次;并在字符串的 END 处修剪所有可能的尾随“B”。
2.如果修剪后左侧部分> 70%的整个字符串,则:在第4行训练“B”的每2行修剪对应部分。
3.然后只附加所有 4 行,第 2 行和第 4 行被修剪。
所以预期的结果如下:
@HWI-ST150_0129:2:1:4226:2616#0/1
CATCTTTTCTCTTAACTTCCATGATGGTACATCTTTTGATTTTTTTTTAATAACGTCTTTGACAGCTTAA
+HWI-ST150_0129:2:1:4226:2616#0/1
d\dddddaddbcad^\^a\]ZZZ_`]\VYa_bZ^_^\YX\X`eeeeffffffefffeeefffefffeeff
我写了一个像这样的脚本:
for((a=1;a<=8000000;a++))
do
if (($a%4==0))
then
b=`cat $FILENAME|head -$a|tail -1|sed 's/\(.\)B*$/\1/g'|wc -c`
d=`cat $FILENAME|head -$a|tail -1|wc -c`
if (( 10*$b/$d>= 7 ))
then
cat $FILENAME|head -$(($a-3))|tail -1
cat $FILENAME|head -$(($a-2))|tail -1|cut -b 1-$(($b-1))
cat $FILENAME|head -$(($a-1))|tail -1
cat $FILENAME|head -$a|tail -1|sed 's/\(.\)B*$/\1/g'
fi
fi
done >> /home/xxx/$DIRNAME/$FILENAME
我认为我更喜欢 bash 代码,仅仅是因为它速度快(?)。但是,当我运行此代码时,考虑 8000000 行时会很慢。另外,也许我在代码中使用了太多“猫”?
快速,我的意思是说,当使用拆分命令拆分 GB 级大文件时;它超级超级快。 (分裂的机制是什么?)
有什么提高速度的建议吗?
【问题讨论】:
-
在这个脚本中你根本不需要 cat。 head、tail、sed 和 wc 都将文件名作为参数。你可以
head -... $FILENAME | tail -1 | cut.....。 partmaps.org/era/unix/award.html ;)。此外,对于代码审查 stackexchange 站点来说,这可能是一个更好的问题。 -
我同意@chown。
cat当您只是将输出通过管道传输到head时,实际上并不需要。 -
谢谢大家。嗯你是对的。所以也许“猫”是限速因素......
-
是的,因为如果您考虑一下,如果您的文件有 800,000 行,那么
cat会仔细阅读所有这些,只是将其传送到head,然后获取前 10 行。更简单的方法是在文件上执行head以在 10 行后停止阅读。 -
@Jaypal:您声称
cat将在将所有行传送到head之前读取它们。那不是真的。cat将读取一行,(或者实际上它会填充 X 字节的缓冲区,但我正在简化,请耐心等待)然后将这一行写入head。然后它将读取另一行,并将该行写入head,依此类推。当head已读取 10 行时,它将退出,这会将 SIGPIPE 发送到cat并在读取所有行之前很久就终止它。见en.wikipedia.org/wiki/SIGPIPE
标签: performance bash