我正在编写一个简单的bash脚本来对>10000个文件进行递归粘贴,每个文件有两列。
这些文件如下所示:
A1BG 3
A1CF 3
A2M 3
A4GALT 5
AAAS 2
AACS 2
AADAT 2
AAGAB 4
AAK1 3
AAMP 2
AANAT 3
AARS 2
AARS2 3
AARSD1 2
...密码是:
SPHERE=Sphere.matrix.txt
rm -rf $SPHERE
for i in `ls *.spheres | sort`; do
if [ -f $SPHERE ]; then
cut -f2 $i \
| paste $SPHERE - > $SPHERE.tmp
mv $SPHERE.tmp $SPHERE
else
cat $i > $SPHERE
fi
done它打开第一个文件并将其写入输出文件。然后打开第二个文件,它接受第二个列,并将其粘贴到输出文件,等等.
代码的工作效率很高,但速度慢得多,因为在每一个循环中,它都必须打开和覆盖一个更大的文件。
如果我能够将aech迭代的结果存储在内存中而不是磁盘中,我认为性能会更快。
你能给我一些指导吗?
非常感谢!
发布于 2015-07-16 08:48:06
如果我理解正确,而且所有文件都有相同的行数,那么您可以使用gnu awk获取每个文件的第2行,但第一行文件除外,可以一次一次构建输出文件:
awk 'FNR==NR {
printf "%s",$0;
for(i = 2;i<ARGC;i++){
f = ARGV[i];
getline <f
printf " %s",$2
}
printf "\n"
}
FNR!=NR{ exit }
' `ls *.spheres | sort` > $SPHEREhttps://stackoverflow.com/questions/31448905
复制相似问题