2015-01-15 48 views
0

我试图水平连接1000个由单个列组成的文件,每个文件包含一个文件。由于所有有要连接的命名文件:myfile1.txtmyfile2.txtmyfile3.txt,......,我用下面的字符串:Cat命令无法水平连接文件

cat $myfile*.txt > myoutput.txt  

不幸的是,该文件是垂直串联。

任何人都可以帮助我吗?

+0

>>是指垂直串联,你应该与其他命令尝试(我不是真的肯定如何在shell中做到这一点,我会用其他编程语言编写脚本) 猫不会做任何串联,它只是输出文件。 – Antzi 2015-01-15 16:06:24

+0

标题不公平,'猫'是为了连续地连接文件的内容,你想要的是交错内容。这不是'猫'承诺要做的。 – 2015-01-15 16:11:17

+1

使用'paste1 file2 file3 ...' – fedorqui 2015-01-15 16:11:39

回答

4

cat命令应该垂直连接文件;否则它会被打破。 (可以用一个非标准选项编写cat的变体来指示它改变它的行为并进行横向连接,但为什么要麻烦?)。

设计成粘贴(串连)的命令文件水平是paste

paste myfile*.txt 

默认情况下,从每一个文件将被制表符分隔的线;您可以使用命令行选项来控制paste的行为和其他各个方面。

如果您有一千个文件,并且每个文件中的每行都包含10个字符,那么您的输出文件将具有10 KiB或更长的行。请注意,POSIX并没有要求公用事业(命令)支持这么长的路线,尽管是最好的意愿。 (LINE_MAX的最小值是2048.)GNU确实需要支持无限长的行,但是您应该仔细检查用于处理paste命令输出的任何内容。

实际上,对于1000个文件,您可能不必担心每个进程的文件描述符限制。使用ulimit -n(或ulimit -a)查找单个进程可打开的文件数限制。如果它是256,则可能需要增加它。您将最终调查“硬限制”和“软限制”(ulimit -H -aulimit -S -a)。

(请注意,cat $myfile*.txt给出了cat myfile*.txt的文件不同的列表,除非变量赋值myfile=myfile首次完成的。)