如何使用perl从文件的行中删除重复的单词

时间:2013-02-03 13:08:34

标签: perl

我是perl的新手,正在为一个相对简单的问题寻找perl解决方案。我想使用perl从文件的一行中删除重复的单词。网上的所有示例都处理重复的行,但我正在寻找删除重复的单词。非常感谢任何帮助。

这是我的档案

lot=list("XI_PBIAS.mMN_VDD_CAP1_BM" "XIBIAS2.mNCS_BIAS_BM" "XIBIAS2.mNCS_BIAS_BM"          "XIBIAS1.mNCS_PCAS_BIAS_BM" "XIBIAS1.mNCS_PCAS_BIAS_BM" "XI_PBIAS.mNCS_PCS_BIAS_BM" )
filename  = "tx_dac_bias_tb"
openResults(strcat(filename ".raw"))

我希望字符串"XIBIAS2.mNCS_BIAS_BM""XIBIAS1.mNCS_PCAS_BIAS_BM"只出现一次。如何逐字而不是逐行读取文件。

3 个答案:

答案 0 :(得分:5)

逐行读取文件,然后将其拆分为单词。

while (<>) {
   chomp;
   my @words = split;
   ...
}

如何删除重复内容已在perlfaq4中解答。

my %seen;
my @unique = grep { ! $seen{$_}++ } @words;

答案 1 :(得分:2)

这显示了如何使用Text::ParseWords(perl 5中的核心模块)来解析括号内的引用字符串。请注意,这不会保留原始空格。您还必须指定要匹配的行类型,因为看起来输入中的所有行都不应该被重复删除。

use strict;
use warnings;
use Text::ParseWords;

sub uniq {
    my %seen;
    grep { not $seen{$_}++ } @_;
}

while (<DATA>) {
    chomp;
    if (/^(.+=\s*list\()(.*)(\).*)$/) {
        my ($pre, $line, $post) = ($1, $2, $3);    # split into fields
        my @list = quotewords('\s+', 1, $line);    # find quoted strings
        @list = uniq(grep defined, @list);         # dedupe, remove empty
        $_ = "$pre@list$post";                     # join the line back up
    }
    print "$_\n";
}

__DATA__
lot=list("XI_PBIAS.mMN_VDD_CAP1_BM" "XIBIAS2.mNCS_BIAS_BM" "XIBIAS2.mNCS_BIAS_BM"          "XIBIAS1.mNCS_PCAS_BIAS_BM" "XIBIAS1.mNCS_PCAS_BIAS_BM" "XI_PBIAS.mNCS_PCS_BIAS_BM" )
filename  = "tx_dac_bias_tb"
openResults(strcat(filename ".raw"))

要在输入文件上使用,请将<DATA>替换为<>并使用如下:

perl script.pl input.txt

答案 2 :(得分:0)

试试这个Perl正则表达式 S /(。*)\ 1 / $ 1 /克