shell - cat - 将文件内容合并到一个大文件中

时间:2012-05-24 12:06:59

标签: shell cat

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

我尝试了以下cat命令:

cat * >> bigfile.txt

但是这个命令的作用是合并所有东西,包括已合并的东西。

e.g。 FILE1.TXT

content1

FILE2.TXT

content2

file3.txt

content3

file4.txt

content4

bigfile.txt

content1
content2
content3
content2
content3
content4
content2

但我想要

content1
content2
content3
content4
<。>在.txt文件中

另一种方式是cat file1.txt file2.txt ...等等......但我不能为超过1k的文件做到这一点!

感谢您的支持!

6 个答案:

答案 0 :(得分:21)

问题是您将bigfile放在同一目录中,从而使其成为*的一部分。像

这样的东西
cat dir/* > bigfile

应该按照您的需要运行,fileN.txt文件位于dir/

答案 1 :(得分: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

答案 2 :(得分:4)

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

shopt -s extglob
cat !(bigfile.txt) > bigfile.txt

答案 3 :(得分:2)

  

另一种方式是cat file1.txt file2.txt ...依此类推......但我不能为超过1k的文件做到这一点!

这就是xargs的用途:

find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt

答案 4 :(得分:1)

这是一个老问题,但我仍然会用xargs

给出另一种方法
  1. 列出要连接的文件

      

    ls | grep [pattern]&gt;文件列表

  2. 使用vicat查看文件的正确顺序。如果你使用后缀(1,2,3,...,N),这应该没问题

  3. 创建最终文件

      

    cat filelist | xargs cat&gt;&gt; [最终文件]

  4. 删除文件列表

      

    rm -f filelist

  5. 希望这有助于任何人

答案 5 :(得分:-3)

尝试:

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

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