将10+文件合并到一个文件中的最佳方法

时间:2015-09-07 21:02:47

标签: perl file merge

编写脚本实际上是否可以有效地为这么多文件(例如15)执行此操作?或者是否有一个特定的一行命令可以用来做这样的事情。

例如,我考虑过的脚本( in pseudo-code )是

open file
while $line = <file>
$line = $data1

open file2
while $line = <file2>
$line2 = $data2

print "data1\ndata2\n..."

以及我需要粘贴到这个新输出文件中的文件数量。

4 个答案:

答案 0 :(得分:2)

如果使用Perl分析文件,则不必合并它们。 Perl的ARGV文件句柄遍历您在命令行中指定的所有文件的所有行(或者实际上放在@ARGV中):

while( <ARGV> ) { # special ARGV filehandle
       print "Line is> $_"; # do stuff on the next line, current line in $_
   }

这是一个常见的习惯用法,它有一个快捷方式,其中ARGV是默认的文件句柄:

while( <> ) { # special ARGV filehandle is the default
   print "Line is> $_";
   }

您将使用您想要通过的所有文件调用脚本:

$ perl my_program file1 file2 ...

当程序到达一个文件的末尾时,它会无缝地转到下一个文件的开头。现在你不需要巨型档案。

有一些有趣的技巧。在此过程中,当前文件名为$ARGV。全局行计数器位于$.

while( <ARGV> ) { # special ARGV filehandle
   print "[$ARGV:$.] Line is> $_";
   }

如果要重置每个文件的行计数器(可能会查看单个文件),可以在当前文件到达文件末尾(eof)时关闭ARGV

while( <ARGV> ) { # special ARGV filehandle
   print "[$ARGV:$.] Line is> $_";
   close ARGV if eof(ARGV);
   }

Perl会自动重新打开ARGV以获取下一个文件。

答案 1 :(得分:1)

cat file1 file2 file3 >combined  # sh or cmd[1]

perl -pe1 file1 file2 file3 >combined  # sh or cmd[1]

copy /y/b file1+file2+file3 combined >nul  # cmd

使用通配符:

cat file* >combined  # sh

perl -pe1 file* >combined  # sh

perl -MFile::DosGlob=glob -pe"BEGIN { @ARGV = map glob, @ARGV }" file* >combined  # cmd[1]

copy /y/b file* combined >nul  # cmd
  1. 很少有Windows系统安装了catperl

答案 2 :(得分:0)

在Windows上,您可以使用:

type file1 file2 file3 > file_all

不确定type是否可以打开的最大文件数,但这是Windows等效于cat(或大多数类似的等效文件)

答案 3 :(得分:-1)

如果您在Windows中执行此操作,则可以使用以下方法:

copy /y/b file1 + file2 + file3 + ... fileN file_all >nul