我在Perl中尝试删除重复的条目。说
File : abc
11
22
11
11
22
33
输出应为:
11
22
33
Perl one-liner使我的工作变得轻松。但我无法理解。它是:
cat abc | perl -ne '$H{$_}++ or print'
根据一些基本知识,我认为“abc的输出是逐行传递的,他们正在将它推入哈希......但-ne
代表什么?为什么他们使用{{1什么是++
语句?解释是什么?
有没有办法可以找到出现次数?
or
答案 0 :(得分:3)
到目前为止你是对的。这会将文件abc
传递给使用哈希的perl
命令。要理解-ne
参数,请将其与此代码进行比较,该代码非常相同,
while (<>){
$H{$_}++ or print $_
}
为明确起见,我还将print
更改为print $_
。
现在这个单行工作的原因是因为当通过执行$H{$_}++
递增哈希中的键值时,我们得到键的相关值的返回值。
我们第一次遇到密钥(来自abc
的行)时,其在散列中的值默认为0
。因此,or
子句尚未满足,它将继续到print $_
(打印行)。但是在随后的任何时候我们遇到一个键,它的返回值将是>0
,因此or
子句将短路,因为Perl中的任何正整数都计算为{{1} }。
值得注意的是,如果我们这样写,那么这个单行将无效:
true
那是因为我们预先递增并且在我们递增之后将返回。
答案 1 :(得分:3)
命令行选项-n循环你的-e代码。如果您键入以下内容:
$ perl -n -e 'some code' file
然后Perl将其解释为:
LINE:
while (<>) {
# your code goes here, each iteration reads
# from file and puts into $_ variable
}
示例中的文件是cat命令的管道输出。
$H{$_}++ or print $_;
这会创建一个哈希,文件行作为键。如果该键不存在,则将该值设为1,否则后递增。第一次($ H {$ _} ++)被评估为false,因此Perl执行右或右句。它与:
相同print $_ unless $H{$_}++;
答案 2 :(得分:0)
开关ne
表示:
-e =此命令行开关允许您从命令行运行代码, 而不是必须将程序写入文件然后执行它。
-n =此命令行开关允许您对标准输入的每一行运行程序(通常用-e指定)。
这就是如何处理逐行输出。
现在,对于散列,如果新值出现,因为它不存在,但是下一次会增加并且由于条件或条件而不打印该值。
为了找到ocncences的数量,我不确定使用perl one liner,脚本会很容易。
U也可以非常简单地在linux中使用sort和uniq:
cat abc |sort | uniq -c
答案 3 :(得分:0)
计数示例:
cat abc | perl -nle'$H{$_}++ ; END { for (keys %H) { print "$_ - $H{$_}" } }'