【问题标题】:how to remove duplicate words from a line of a file using perl如何使用perl从文件的一行中删除重复的单词
【发布时间】:2017-07-24 16:42:34
【问题描述】:

我是 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" 只出现一次。如何逐字而不是逐行读取文件。

【问题讨论】:

  • 你应该给出一个到目前为止你已经尝试过的代码示例,以获得具体的帮助。
  • 这是您的实际输入,还是某种代码?
  • “网络上的所有示例都处理重复的行”似乎有点遥不可及。即使是remove duplicate words perl第一个 Google 结果看起来也很有希望。

标签: perl


【解决方案1】:

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

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

perlfaq4 回答了如何删除重复项。

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

【讨论】:

  • #!/usr/bin/perl open(FH,"tx_dac_bias_tb.awd");我的@array;我的 %seen = ;我的@unique = grep { $seen{$_}++ } @array;打印 FH @array;关闭 FH;这段代码似乎没有帮助。您能否详细说明您的解决方案。
  • @sagar :当您发布此评论时,我更新了解决方案。现在就试试吧。
  • #!/usr/bin/perl open(FH,"tx_dac_bias_tb.awd");我的@array;我的 %seen = ;我的@unique = grep { $seen{$_}++ } @array;打印 FH @array;关闭 FH;这段代码似乎没有帮助。您能否详细说明您的解决方案。
  • @sagar : 1. 你需要打印@unique。 2. 您编写代码的方式,您不能打印到与您正在读取的文件句柄相同的文件句柄。
  • 不要把字放在%seen,把它们放在@words
【解决方案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"))

要在输入文件上使用,请将 &lt;DATA&gt; 替换为 &lt;&gt; 并像这样使用:

perl script.pl input.txt

【讨论】:

  • 我收到包编译错误,在@INC 中找不到 List/MoreUtils.pm(@INC 包含:/net/cmp1/disk1/aura/design_bin/perlpackage /usr/lib/ perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386- linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/ 5.8.8 .) 我正在使用客户端计算机,因此无法安装所需的软件包。有什么解决办法吗?
  • @sagar 你可以安装包,也可以直接使用 uniq 本身的代码,这很简单。这与 ikegami 在他的帖子 my %seen; my @unique = grep { !$seen{$_}++ } @list 中使用的代码相同
  • @sagar 没关系,我只是添加了代码。为 4 行代码加载整个模块没有多大意义。
  • "my" 变量 %seen 掩盖了bias1.pl 第13行相同范围内的早期声明。bias1.pl 第11行的语法错误,靠近") sub uniq "不能使用全局$_ in “my”位于bias1.pl 第13 行,靠近“{$_” 语法错误在bias1.pl 第14 行,靠近“}” 由于编译错误,bias1.pl 的执行中止。运行代码时出现上述错误。你能指出指针中的错误吗?提前感谢所有帮助
  • "my" 变量 %seen 掩盖了bias1.pl 第13行相同范围内的早期声明。bias1.pl 第11行的语法错误,靠近") sub uniq "不能使用全局$_ in “my”在 bias1.pl 第 13 行,靠近“{$_” 语法错误在bias1.pl 第 14 行,靠近“}” 由于编译错误,bias1.pl 的执行中止。
【解决方案3】:

试试这个 Perl 正则表达式 s/(.*)\1/$1/g

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多