【发布时间】:2014-07-14 10:00:33
【问题描述】:
我是 perl 新手,我想用 perl 实现以下目标。
我有一个包含以下数据的文件:
/dev/hda1 /boot ext3 rw 0 0 /dev/hda1 /boot ext3 rw 0 0
我想从文件中提取第二个字段并仅打印唯一值。这个例子我想要的输出是,程序应该打印:
ext3
如果我有几个不同的文件系统,它应该打印在同一行。
我尝试了很多代码,但都被卡住了。
谢谢
【问题讨论】:
我是 perl 新手,我想用 perl 实现以下目标。
我有一个包含以下数据的文件:
/dev/hda1 /boot ext3 rw 0 0 /dev/hda1 /boot ext3 rw 0 0
我想从文件中提取第二个字段并仅打印唯一值。这个例子我想要的输出是,程序应该打印:
ext3
如果我有几个不同的文件系统,它应该打印在同一行。
我尝试了很多代码,但都被卡住了。
谢谢
【问题讨论】:
如果你喜欢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
【讨论】:
awk 中完成。
#!/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 ....
【讨论】:
perl -anE '$s{$F[2]}++ }{say for keys %s' file
或
perl -anE '$s{$_}++ or say for $F[2]' file
【讨论】:
perl -anE 'BEGIN{ @r= splice(@ARGV,1,$#ARGV) } $s{$_}++ or say for $F[2]' file