【问题标题】:pattern check using awk使用 awk 进行模式检查
【发布时间】:2021-02-11 06:01:40
【问题描述】:

有没有办法使用awk或python来检查模式,我们组有120,000行消息但要知道谁回复最多;

考虑以下几行;

  • AA
  • BB
  • AA
  • 抄送
  • AA
  • BB
  • AA
  • AA
  • AA
  • BB
  • 抄送
  • AA

我希望显示结果

  • AA->BB = 3
  • BB->AA = 2
  • AA->CC = 1
  • CC->AA = 2
  • AA->CC = 1
  • BB->CC = 1
  • CC->BB = 0

【问题讨论】:

    标签: python awk data-science


    【解决方案1】:
    $ awk -v OFS="=" '                           # set for one single use
    {
        if(FNR>1 && p!=$0)                       # exclude unwanted
            a[p "->" $0]++                       # count
        p=$0                                     # save $0 for next round
    }
    END {                                        # in the end
        PROCINFO["sorted_in"]="@val_num_desc"    # ordering in GNU awk
        for(i in a)                              # We loop
            print i,a[i]                         # and count
    }' file
    

    输出:

    AA->BB=3
    BB->AA=2
    CC->AA=2
    AA->CC=1
    BB->CC=1
    

    如果您希望输出排序而不是与实现相关的 awk 默认值,并且您使用的是 GNU awk,请使用 PROCINFO["sorted_in"]="@val_num_desc"。如果不是,请删除该行并将输出通过管道传输到sort -t= -k2n

    【讨论】:

      【解决方案2】:

      这样的事情对你来说可能就足够了:

      $ awk 'NR > 1 && prev != $1 { sum[prev"->"$1]++ }
             { prev = $1 }
             END { for (a in sum) { print a" = "sum[a] } }
        ' input.txt
      AA->CC = 1
      BB->AA = 2
      AA->BB = 3
      BB->CC = 1
      CC->AA = 2
      
      • 排序是随机的,
      • 它不会打印两次AA->CC = 1 ;)
      • 它不打印空关系CC->BB = 0

      【讨论】:

      • ++ for 它不会打印 AA->CC = 1 两次 ;) :D :D
      • 非常感谢,效果很好:我现在可以使用它来计算谁在 whatsapp 消息中回复了谁
      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多