我有一个在 crontab 中运行的 Perl 脚本,它生成一个包含大量重复条目的文件,因为每次运行它都会重写以前写入的信息。
我会使用 sort -u
文件,但是,我会在 Perl 脚本文件的末尾进行排序。
我的 list
10/10/2017 00:01:39:000;Sagitter
10/11/2017 00:00:01:002;Lupus
10/12/2017 00:03:14:109;Leon
10/12/2017 00:09:00:459;Sagitter
10/13/2017 01:11:03:009;Lupus
12/13/2017 04:29:00:609;Ariet
10/11/2017 00:00:01:002;Lupus
10/12/2017 00:03:14:109;Leon
...
我的代码
#!/usr/bin/perl
# Libraries
use strict;
use warnings 'all';
%lines = ();
# Remove duplicate
open( TMP_GL_OUTPUT, '>', $OUTPUT_FILE ) or die $!;
while ( <TMP_GL_OUTPUT> ) {
$lines{$_}++;
}
open( OUTFILE, '>', $TMPOUTPUT_FILE ) or die $!;
print OUTFILE keys %lines;
close( OUTFILE );
close( TMP_GL_OUTPUT );
我哪里错了?在 shell 中感觉比在 Perl 中短。
sort -u $TMPOUTPUT_FILE > $OUTPUT_FILE
根据ikegamy用户的建议,我做了如下操作:
move $OUTPUT_FILE, $TMPOUTPUT_FILE; # Copy file
run [ 'sort', '-u', '--', $TMPOUTPUT_FILE ], '>', $OUTPUT_FILE; # Remove duplicate
unlink $TMPOUTPUT_FILE;
最佳答案
我想你是在问为什么你的 Perl 程序比你的 shell 脚本长。
首先,您的 shell 脚本做的事情与您的 Perl 程序完全不同。
- 您的 shell 脚本执行一个程序,并将其存储在一个文件中。
- 您的 Perl 程序读取一个文件,处理它读取的数据,并将输出存储在一个文件中。
Perl 相当于
sort -u -- "$TMPOUTPUT_FILE" > "$OUTPUT_FILE"
是
use IPC::Run qw( run );
run [ 'sort', '-u', '--', $TMPOUTPUT_FILE ], '>', $OUTPUT_FILE;
(这两者在错误处理上有区别。)
它们的长度差别不大。
这就引出了第二个区别。 shell 专门用于执行程序,但 Perl 是一种通用语言。如果它不再使用 Perl,那将是令人惊讶的!
(现在尝试将 Perl 程序的大小与 sort
的源代码进行比较...)
关于perl - 从文件中删除多个重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177845/