最终我放弃了漂亮的 shell 方法,并用 C 编写了另一个版本。很遗憾,它并不漂亮,但它的速度提高了三个数量级以上(总运行时间为 43 秒,而估计为 28 小时awk 方法,给定预缓存的数据)。它需要更改 ulimit 以允许打开足够多的文件,如果您的行长于 LINE_LENGTH,它将无法正常工作。
尽管如此,它的运行速度还是比下一个最佳解决方案快 2300 倍。
如果有人偶然发现这个想要做这个任务,这个会做的。请小心并检查它是否确实有效。
#include <stdio.h>
#include <stdlib.h>
#define LINE_LENGTH 1024
int main(int argc, char* argv[]) {
int fn;
int ln;
char read[LINE_LENGTH];
int fmax=10;
int ftot=0;
FILE** files=malloc(fmax*sizeof(FILE*));
char fname[255];
printf("%d arguments\n", argc);
printf("opening %s\n",argv[1]);
FILE* open = fopen(argv[1],"r");
for(ln=0;fgets(read,LINE_LENGTH,open); ln++) {
if(ln==fmax) {
printf("%d has reached %d; reallocing\n",ln,fmax);
fmax*=2;
files=realloc(files,fmax*sizeof(FILE*));
}
sprintf(fname, "times/%09d.txt",ln);
files[ln]=fopen(fname,"w");
if(files[ln]==0) {
fprintf(stderr,"Failed at opening file number %d\n",ln);
return 1;
}
fprintf(files[ln],"%s",read);
}
ftot=ln;
fclose(open);
for(fn=2;fn<argc;fn++) {
printf("working on file %d\n",fn);
open=fopen(argv[fn],"r");
for(ln=0;fgets(read,LINE_LENGTH,open); ln++) {
fprintf(files[ln],"%s",read);
}
fclose(open);
}
for(ln=0;ln<ftot;ln++) {
fclose(files[ln]);
}
return 0;
}