曲径通幽论坛

标题: 命令行参数之 -F -- 指定分隔符 [打印本页]

作者: beyes    时间: 2012-7-19 15:32
标题: 命令行参数之 -F -- 指定分隔符
和 awk 的 -F 选项一样,Perl 也可用该选项来指定分隔符。

供测试文本内容:
$ cat tmp.txt
hello world
hello linux
hello perl
good perler
best linuxer
strong unixer
weak windower
运行下面命令:
perl -F'\W' -ane 'END {print $x} $x += @F' tmp.txt
14
上面命令,\W 表示非单字匹配,等效于 [^A-Za-z_0-9] ,该选项和 -a  搭配起来用,意思就是说,-a  会根据内容中的有规律的非单字字符进行自动分隔,比如下面一个文本:
$ cat tmp2.txt
abc:123:kab
321:aed:net
每一行之间使用冒号进行分隔,那么对于该文本,如果想统计有多少个被冒号分隔的单元,那么同样可以使用上面的命令。当然,也可以用 -F 显示指出这个冒号分隔符,如:
$ perl -F':' -ane 'END {print $x} $x += @F' tmp2.txt
6

下面再以 /etc/passwd 为例,查看一个稍微复杂点的例子:
$ perl -F':' -ane 'chomp($F[6]); $s{$F[6]}++;' -e 'END { print "$_ : $s{$_}\n" for keys %s }' /etc/passwd
/bin/sh : 1
/sbin/halt : 1
/bin/sync : 1
/sbin/nologin : 40
/sbin/shutdown : 1
/bin/bash : 3
/bin/false : 1
该命令对 /etc/passwd 这个文件中不同的用户所使用的终端数做一个统计。命令中,$F 就是 @F  数组,它存储了以冒号分隔的各个元素,其中第 6 个元素就是终端名称,需要注意的是,所获取的终端名称里仍然包含了末尾的换行符,因此为了以后的输出美观,这里就先用 chomp()  函数将该换行符去掉。


$s 是个散列表,它以“终端名”作为其键,键所对应的值就是该终端被多少个用户所使用。$s{$F[6]}++ 正是用来累加统计用户数的。


在统计完后,在 END 中将统计结果打印出来。其中,keys 是一个函数,它能返回哈希的键列表;for 用来遍历 keys 所返回的列表,每次得到的键默认存储在预定义变量 $_ 中。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2