【问题标题】:Perl reading file, printing unique value from a columnPerl读取文件,从列中打印唯一值
【发布时间】:2014-07-14 10:00:33
【问题描述】:

我是 perl 新手,我想用 perl 实现以下目标。

我有一个包含以下数据的文件:

/dev/hda1 /boot ext3 rw 0 0
/dev/hda1 /boot ext3 rw 0 0

我想从文件中提取第二个字段并仅打印唯一值。这个例子我想要的输出是,程序应该打印:

ext3

如果我有几个不同的文件系统,它应该打印在同一行。

我尝试了很多代码,但都被卡住了。

谢谢

【问题讨论】:

    标签: arrays perl file unique


    【解决方案1】:

    如果你喜欢awk:

    $ cat file
    /dev/hda1 /boot ext3 rw 0 0
    /dev/hda1 /boot ext3 rw 0 0
    
    $ awk '!seen[$3]++{print $3}' file
    ext3
    

    或者,使用cut:

    $ cut -d" " -f3 file  | sort | uniq      # or use just sort -u if your version supports it
    ext3
    

    这里是perl解决方案:

    $ perl -lane 'print $F[2] unless $seen{$F[2]}++' file
    ext3
    

    这里是 perl 命令行选项的解释(来自perl -h):

    l: enable line ending processing, specifies line terminator
    a: autosplit mode with -n or -p (splits $_ into @F)
    n: assume "while (<>) { ... }" loop around program
    e: one line of program (several -e's allowed, omit programfile)
    

    有关这些选项的更好解释,请参阅:https://blogs.oracle.com/ksplice/entry/the_top_10_tricks_of

    【讨论】:

    • 可能值得解释一下您选择的标志,因为 OP 对 Perl 来说是新的。
    • @jaypal,谢谢。我不知道这可以完全在awk 中完成。
    • @TomFenech,添加了解释。谢谢。
    • 谢谢,如何将所有数据打印在以空格分隔的同一行?
    • @Shann,为这个新问题提供示例输入和预期输出。
    【解决方案2】:
    #!/usr/bin/perl
    
    my %hash ;
    while (<>) {
    if (/\s*[^\s]+\s+[^\s]+\s+([^\s]+)\s+.*/) {
        $hash{$1}=1;
    }
    }
    print join("\n",keys(%hash))."\n";
    

    用法:

     ./<prog-name>.pl file1 fil2 ....
    

    【讨论】:

    • 你能告诉我如何只使用file1吗?即我只想使用第一个参数
    【解决方案3】:
    perl -anE '$s{$F[2]}++ }{say for keys %s' file
    

    perl -anE '$s{$_}++ or say for $F[2]' file
    

    【讨论】:

    • 是否可以在 perl 脚本中编写类似的内容?这将只使用我的第一个参数作为文件名
    • @Shann 是的,perl -anE 'BEGIN{ @r= splice(@ARGV,1,$#ARGV) } $s{$_}++ or say for $F[2]' file
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多