在内存中存储for循环迭代

时间:2015-07-16 08:19:29

标签: bash

我正在编写一个简单的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迭代的结果存储在内存而不是磁盘中,我认为执行会更快。

你可以给我一些指导吗?

非常感谢你!

1 个答案:

答案 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