编写脚本实际上是否可以有效地为这么多文件(例如15)执行此操作?或者是否有一个特定的一行命令可以用来做这样的事情。
例如,我考虑过的脚本( in pseudo-code )是
open file
while $line = <file>
$line = $data1
open file2
while $line = <file2>
$line2 = $data2
print "data1\ndata2\n..."
以及我需要粘贴到这个新输出文件中的文件数量。
答案 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
cat
或perl
。答案 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