zoukankan      html  css  js  c++  java
  • perl命令行 代替 各种shell 一则

    前两天在微博中看到一个各种管道符组成的命令,是用来统计history的,也就是说,统计你平时使用次数最多的命令,内容如下:

     

    1 history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t |sort -nr | nl | head -n10

     

    当然,如果作为一个awk或者sed偏执狂,根本不需要后面的管道符;

    后来,发现有人follow了一条perl版本如下:

     

    1 history | perl -ne '/\s+\d+\s+(.*)/ && ++$map{$1};END{map {print ++$i." $map{$_} ".$map{$_}/keys(%map)." $_\n"} reverse sort {$map{$a}<=>$map{$b}} keys(%map);}' | head -n10

     

    本身我也想搞一条perl版本,但无奈,不知道怎么在一条perl -ne参数下,连续写两个循环,看了上面这条perl,才发现,可以使用END结束上面的循环,然后继续;

    然后,我就借鉴了上面这位仁兄的perl条目,自己也写了一条:

     

    1 history |perl -lane '$map{$F[1]}++;END{map {print ++$i." $map{$_} ".$map{$_}/keys(%map)." $_\n"} reverse sort {$map{$a}<=>$map{$b}} keys(%map);}'|head -n10

     

    哈哈,稍微比他的精简一点点。

     

    不过呢,这位仁兄厉害的地方不是END的应用,而是后面的map,有看懂后面的map么?

     

     1 map {print ++$i   .   \
     2 
     3  " $map{$_} "   .   \
     4 
     5 $map{$_} / keys(%map)   .   \
     6 
     7 " $_\n"}   \
     8 
     9 reverse sort  { \
    10 
    11 $map{$a}  <=>   $map{$b} \
    12 
    13 }   keys(%map);

     

     

    看清了么?用map将%map的键比较大小后颠倒排序,以前面的方式重新输出,这种能拿print在map里直接输出的方法,还是第一次见到,长见识了,学习一下,顺便拿出来给大家看看。

  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/agostop/p/2516294.html
Copyright © 2011-2022 走看看