我正在尝试使用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的文件做到这一点!
感谢您的支持!
答案 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
列出要连接的文件
ls | grep [pattern]&gt;文件列表
使用vi
或cat
查看文件的正确顺序。如果你使用后缀(1,2,3,...,N),这应该没问题
创建最终文件
cat filelist | xargs cat&gt;&gt; [最终文件]
删除文件列表
rm -f filelist
希望这有助于任何人
答案 5 :(得分:-3)
尝试:
cat `ls -1 *` >> bigfile.txt
我目前没有方便的unix机器为你测试它。