我正在编写一个简单的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迭代的结果存储在内存而不是磁盘中,我认为执行会更快。
你可以给我一些指导吗?非常感谢你!
答案 0 :(得分:1)
如果我理解正确,并且所有文件具有相同的行数,您可以使用gnu awk来获取每个文件的第2列,除了第一行,每次一行,以一次构建输出文件:< / p>
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` > $SPHERE