結局、私はプリティ シェル メソッドをあきらめて、C で別のバージョンを書きました。悲しいことに、プリティ シェルではありませんが、3 桁以上高速です (合計実行時間は 43 秒です。事前にキャッシュされたデータが与えられた 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;
}