将一批文件连接到一个文件夹中

concatenating batch of files in a folder

我正在使用 Ubuntu OS。我有一个文件夹,其中包含名为:

的文件
part-r-00000_dep1.csv
part-r-00000_dep1.csv
part-r-00000_dep1.csv
.
.
.
part-r-000799_dep1.csv

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

cat part-r-0000*_dep1.csv part-r-0001*_dep1.csv > part_0-19.csv
cat part-r-0002*_dep1.csv part-r-0003*_dep1.csv > part_20-39.csv
cat part-r-0004*_dep1.csv part-r-0005*_dep1.csv > part_40-59.csv
cat part-r-0006*_dep1.csv part-r-0007*_dep1.csv > part_60-79.csv
.
.

但是,我需要执行 运行 这个命令太多次,直到文件夹结束。有没有办法让它更聪明、更高效?我对这个操作系统没有太多经验,所以我很乐意得到一些帮助。

你可以这样写:

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 取值 {0, 20, 40, …, 780}(这样你就可以写入 part_0-19.csv, part_20-39.csv, 等等),并且如果(例如)i20,则 j 取值 {20, 21, … 39}(以便您从 part-r-00020_dep1.csvpart-r-00021_dep1.csv 等处读取)。

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

您可以将所有输入文件存储在一个数组中,然后使用数组上的子字符串扩展运算符将名称分块传递给 cat

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

(这与 ruakh 的答案基本相同,但它们的数组可让您最大限度地减少调用 cat 的次数。)