Linux-Linux中高效合并文本文件的方法

Linux-Linux中高效合并文本文件的方法

夜无邪 发布于 2017-04-23 字数 122 浏览 1104 回复 3

我一般会用cat来合并,比如:
cat a.txt b.txt > c.txt
但总觉得这样合并大文件很慢,有没有比较高效的方法?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2017-07-26 3 楼

可以用c去解决

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/dir.h>

#define SUCCESS 1
#define READ_BUFF 8192

int main(int argc,char** argv)
{
printf("--- file combine Programme ---n");

if(NULL==argv[2])
{
printf("Input param error! exit...nPls use ./main data_folder outputCombinedFileNamen");
exit(0);
}

char *filePrefix = new char[256];
char *fileListBuf = new char[READ_BUFF];

DIR *dirp;
struct dirent* dp;
char *str = new char[256];
long fileSize = 0L;
int nread = 0;

if((dirp=opendir(argv[1])) == NULL ) return -1;
else
{
while((dp = readdir(dirp))!= NULL)
{
FILE *fd;
FILE *outFile;
if(strcmp(dp-> d_name,".")==0||strcmp(dp->d_name,"..")==0)continue;
sprintf(str,"%s/%s",argv[1],dp->d_name);

if((fd=fopen(str,"r"))!=NULL)
{
printf("Combining %s now ...n",str);
fseek(fd,0,SEEK_END);
fileSize = ftell(fd);
rewind(fd);

outFile = fopen(argv[2],"a+");
if(NULL == outFile)
{
printf("open output file error!n");
}
while((nread=fread(fileListBuf,sizeof(char),READ_BUFF,fd))>0)
{
fwrite(fileListBuf,sizeof(char),nread,outFile);
}
fclose(fd);
fclose(outFile);
}
}
}

closedir(dirp);
delete[] filePrefix;
delete[] fileListBuf;
delete[] str;
return SUCCESS;
}

想挽留 2017-06-29 2 楼

也许用perl隐式循环的命令行-n可以解决这个问题:

perl -n -e "open(OUT,">>c.txt");print OUT $_;" a.txt
perl -n -e "open(OUT,">>c.txt");print OUT $_;" b.txt

(linux中perl的help文件给出的解释是,perl -n表示“assume a while(<>){……} loop around program”,即假设把命令行中的语句放进一个while循环中,而这个循环默认是读入外部文件的一行循环一次)

甜柠檬 2017-05-21 1 楼

sed
ed
awk 这都是处理文件的多方便了 都是逐行读出来的cat 是先放到内存然后给放到屏幕上的他跟sort是一个性质
我写个例子
把a-z的文件全放到test
sed '' {a..z}.log >> test.log 2> /dev/null
awk '1' {a..z}.log >> test.log 2>/dev/null