连接文件夹中的一批文件

时间:2015-09-17 19:43:31

标签: linux bash concatenation batch-processing cat

我正在使用Ubuntu OS。我有一个文件夹名为:

void mergesort(int *low, int *high){
     int *barr = new int[high-low+1];
     mergesort(*low, *high, *barr);
}

我需要将每个20个文件连接成一个新文件,所以我使用了以下命令:

void mergesort(int *low, int *high, int *barr){
     int *mid;
     if(high - low < 2)
         return;
     int interval = high - low;
     *mid = interval/2;
     mergesort(low, mid, barr);
     mergesort(mid, high, barr);
     merge(low, high, barr);
}

但是,我需要多次运行此命令到文件夹的末尾。有办法更聪明,更有效吗?我对这个操作系统没有很多经验,所以我很乐意为此提供一些帮助。

2 个答案:

答案 0 :(得分:2)

您可以将所有输入文件存储在一个数组中,然后使用数组中的子字符串扩展运算符将这些名称以块的形式传递给data _total_obs; length Member_Name $7.; set snap1.&dsname end=eof; retain Member_Name "&dsname"; if(NOT missing(var) ) then Total_Obs+1; if(eof); format Total_Obs comma8.; run;

cat

(这与ruakh的答案基本相同,但是它们可以让你最小化你调用batch_size=20 files=(part-r-*_dep1.csv) for ((start=0; start < ${#files[@]}; start+=batch_size)); do cat "${files[@]:start:batch_size}" > part_${start}_$((start+batch_size-1)).csv done 的次数。)

答案 1 :(得分:1)

你可以这样写:

for (( i = 0 ; i < 800 ; i += 20 )) ; do
    for (( j = i ; j < i + 20 ; ++j )) ; do
        cat "part-r-$(printf %05d "$j")_dep1.csv"
    done > "part_$i-$((i+19)).csv"
done

此处i采用值{02040,...,780}(以便您写入part_0-19.csvpart_20-39.csv等,如果(例如)i20,则j采用值{2021 ,... 39}(以便您阅读part-r-00020_dep1.csvpart-r-00021_dep1.csv等。)

(免责声明:未经测试。)