Perl读取文件,从列中打印唯一值

时间:2014-05-25 14:36:59

标签: arrays perl file unique

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

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

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

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

ext3

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

我尝试过很多代码但是我被困了。

谢谢

3 个答案:

答案 0 :(得分:6)

如果您更喜欢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

答案 1 :(得分:1)

#!/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 ....

答案 2 :(得分:1)

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

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