perl - 从文件中删除多个重复行

标签 perl duplicates

我有一个在 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/

相关文章:

regex - 匹配除包含 '_iq_' 以外的所有内容

perl - 模板工具包中的单引号转义

ios - 关于从照片应用程序中删除重复照片的应用程序

mysql - 连接具有共同重复键的字段并删除那些重复的字段,留下一个

LISP - 计算列表中每个值的出现次数

perl - 我应该如何大写 Perl?

perl socket编程连续写入socket后的问题

duplicates - 如何防止序言中出现重复

arrays - 在 O(1) 空间和 O(n) 时间中确定大小为 n 的数组中具有 0 到 n-2 范围内值的所有重复项

perl - WWW::Mechanize GET 超时时保存部分内容