将一批文件连接到一个文件夹中
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
, 等等),并且如果(例如)i
是 20
,则 j
取值 {20
, 21
, … 39
}(以便您从 part-r-00020_dep1.csv
、part-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
的次数。)
我正在使用 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
, 等等),并且如果(例如)i
是 20
,则 j
取值 {20
, 21
, … 39
}(以便您从 part-r-00020_dep1.csv
、part-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
的次数。)