从文件中删除多个重复的行

Tho*_*wez 2 perl duplicates

我有一个在crontab中运行的Perl脚本,它生成一个包含重复条目的文件,因为在每次运行时它都会重写先前写入的信息.

我会使用一个sort -u文件,但是,我会在Perl脚本文件的末尾执行此操作.

我的列表

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
...
Run Code Online (Sandbox Code Playgroud)

我的代码

#!/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 );
Run Code Online (Sandbox Code Playgroud)

我哪里错了?在shell中它比Perl感觉更短.

sort -u $TMPOUTPUT_FILE > $OUTPUT_FILE 
Run Code Online (Sandbox Code Playgroud)

正如ikegamy用户建议的那样,我做如下:

move $OUTPUT_FILE, $TMPOUTPUT_FILE; # Copy file
run [ 'sort', '-u', '--', $TMPOUTPUT_FILE ], '>', $OUTPUT_FILE; # Remove duplicate
unlink $TMPOUTPUT_FILE;
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

我想你在问为什么你的Perl程序比你的shell脚本更长.

首先,您的shell脚本与Perl程序完全不同.

  • shell脚本执行程序,并将其存储在文件中.
  • 您的Perl程序读取文件,操纵它读取的数据,并将输出存储在文件中.

Perl相当于

sort -u -- "$TMPOUTPUT_FILE" > "$OUTPUT_FILE"
Run Code Online (Sandbox Code Playgroud)

use IPC::Run qw( run );

run [ 'sort', '-u', '--', $TMPOUTPUT_FILE ], '>', $OUTPUT_FILE;
Run Code Online (Sandbox Code Playgroud)

(这两者之间的错误处理存在差异.)

它们的长度没有那么不同.

这带来了第二个区别.shell专门用于执行程序,但Perl是一种通用语言.如果不再是Perl,那将是令人惊讶的!

(现在尝试将Perl程序的大小与sort... 的来源进行比较)

  • 呵呵??? 我没有发布任何解决方案.我刚回答了一个关于语言差异的问题.这篇文章不应被视为执行`sort`实用程序的认可.(有理由这是一个好主意,并且有理由不是.) (2认同)