12

我正在尝试使用 bash 将文件列表(超过 1K)的内容合并到一个大文件中。

我试过以下 cat 命令:

cat * >> bigfile.txt

但是这个命令所做的是合并所有内容,包括已经合并的内容。

例如 file1.txt

content1

文件2.txt

content2

文件 3.txt

content3

文件4.txt

content4

大文件.txt

content1
content2
content3
content2
content3
content4
content2

但我只想

content1
content2
content3
content4

在 .txt 文件中

另一种方式是cat file1.txt file2.txt ...等等......但我不能为超过 1k 个文件执行此操作!

谢谢您的支持!

4

6 回答 6

24

问题是您放在bigfile同一个目录中,因此使其成为*. 所以像

cat dir/* > bigfile

应该按照您的意愿工作,您的fileN.txt文件位于dir/

于 2012-05-24T12:10:40.670 回答
4

在重新阅读您的问题时,您似乎希望将数据附加到bigfile.txt,但不添加重复项。您必须通过所有内容sort -u以过滤掉重复项:

sort -u * -o bigfile.txt

-o排序选项允许您在文件被输出覆盖之前安全地将 的内容包含在bigfile.txt输入中以进行排序。

编辑:假设 bigfile.txt 已排序,您可以尝试一个两阶段的过程:

sort -u file*.txt | sort -um - bigfile.txt -o bigfile.txt

首先,我们对输入文件进行排序,删除重复项。我们将该输出通过管道传输到另一个sort -u进程,这个进程-m也使用选项,它告诉sort合并两个先前排序的文件。我们将合并的两个文件是-(标准输入,来自第一个的流sort)和bigfile.txt它本身。我们再次使用该选项允许我们在将输出作为输入读取后将-o其写回。bigfile.txt

于 2012-05-24T12:30:39.897 回答
4

您可以将输出文件保存在同一目录中,您只需比以下内容更复杂一点*

shopt -s extglob
cat !(bigfile.txt) > bigfile.txt
于 2012-05-24T12:43:00.340 回答
2

另一种方法是 cat file1.txt file2.txt ...等等...但我不能为超过 1k 个文件执行此操作!

这就是 xargs 的用途:

find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt
于 2012-05-24T12:44:43.890 回答
1

这是一个老问题,但我仍然会给出另一种方法xargs

  1. 列出要连接的文件

    ls | grep [模式] > 文件列表

  2. 使用 或 检查您的文件的顺序是否vi正确cat。如果你使用后缀 (1, 2, 3, ..., N) 这应该没问题

  3. 创建最终文件

    猫文件列表 | xargs 猫 >> [最终文件]

  4. 删除文件列表

    rm -f 文件列表

希望这对任何人都有帮助

于 2014-11-07T17:52:49.667 回答
-3

尝试:

cat `ls -1 *` >> bigfile.txt

我目前没有方便的 unix 机器来先为您测试它。

于 2012-05-24T12:12:37.410 回答