1

我在一个文件夹中有几个(60,000)个文件,需要组合成 3 个单独的文件。我将如何解决这个问题,以便我可以让每个文件都包含这些文件中约 20,000 个的内容?

我知道这就像一个循环:

for i in {1..20000}
do
cat file-$i > new_file_part_1
done
4

4 回答 4

5

正在做:

cat file-$i > new_file_part_1

new_file_part_1每次循环迭代时都会截断。您要附加到文件:

cat file-$i >> new_file_part_1
于 2013-05-15T14:03:25.983 回答
4

其他答案在每次迭代时关闭并打开文件。我会比较喜欢

for i in {1..20000}
do
    cat file-$i
done > new_file_part_1

因此所有cat运行的输出都通过管道传输到一个文件中,该文件只打开一次。

于 2013-05-15T14:24:27.807 回答
0

假设哪个输入文件去哪个输出文件并不重要:

for i in {1..60000} 
do 
  cat file$i >> out$(($i % 3))
done

该脚本使用模运算符%将输入分为 3 个 bin;它将生成 3 个输出文件:

  • out0 包含文件 3、文件 6、文件 9、...
  • out1 包含文件 1、文件 4、文件 7、...
  • out2 包含文件 2、文件 5、文件 8、...
于 2013-05-15T14:21:00.467 回答
0
#!/bin/bash

cat file-{1..20000} > new_file_part_1

cat仅启动一次,并且仅打开和关闭输出文件一次。不需要循环,因为cat可以接受所有 20000 个参数。

一位精明的观察者指出,在某些系统上,20000 个参数可能超过系统的ARG_MAX限制。在这种情况下,xargs可以使用,惩罚cat将启动多次(但仍明显少于 20000 次)。

echo file-{1..20000} | xargs cat > new_file_part_1

这是有效的,因为在 Bash 中,echo它是一个内置的 shell,因此不受ARG_MAX.

于 2013-05-15T15:00:07.230 回答