Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 连接文件夹中的批文件_Linux_Bash_Concatenation_Batch Processing_Cat - Fatal编程技术网

Linux 连接文件夹中的批文件

Linux 连接文件夹中的批文件,linux,bash,concatenation,batch-processing,cat,Linux,Bash,Concatenation,Batch Processing,Cat,我正在使用Ubuntu操作系统。我有一个文件夹,其中的文件名为: 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.

我正在使用Ubuntu操作系统。我有一个文件夹,其中的文件名为:

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;i<800;i+=20))的
;做
对于((j=i;j“第i部分-$((i+19)).csv”
完成
这里,
i
取值{
0
20
40
,…,
780
(这样你就可以写入
部分0-19.csv
部分20-39.csv
,等等),如果(例如)
i
20
,那么
j
取值{
20
21
(以便您阅读
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
batch\u size=20
文件=(part-r-*\u dep1.csv)
对于((start=0;start<${{#files[@]};start+=batch#u size)),执行以下操作
cat“${files[@]:start:batch_size}”>part_${start}{u$((start+batch_size-1)).csv
完成

(这与ruakh的答案基本相同,但它们的数组可以让你最小化调用
cat

谢谢你的回答。我尝试使用你的代码,结果得到:
语法错误:循环变量不好
。知道为什么吗?@Supertwister:啊,是的。你的问题被标记为[bash],但您可能是从Ubuntu interactive shell运行此命令,默认情况下,它实际上是Dash(Dash没有Bash的所有功能;它为速度和简单性而优化)。最简单的修复方法是打开
Bash
,然后运行我提供的命令。谢谢。效果非常好:)谢谢您的回答。我刚刚测试了你的脚本,发现
语法错误:(“意外的
。知道为什么吗?+1.这种方法和我的方法IMHO的主要区别在于,这种方法是根据实际文件名驱动的,而我的方法是根据预期文件名驱动的。如果缺少一些数字,那么这两种方法都会爆炸,但方式不同。:-P它们都是有用的方法在某人的工具箱里。