【问题标题】:Convert tallies to relative probabilities将计数转换为相对概率
【发布时间】:2011-06-21 03:22:57
【问题描述】:

背景

根据单词和计数的 CSV 文件创建概率词典。这是文本分割问题的前奏,不是作业问题。

问题

给定一个包含以下单词和标签的 CSV 文件:

aardvark,10
aardwolf,9
armadillo,9
platypus,5
zebra,1

创建一个具有相对于文件中最大计数的概率的文件:

aardvark,1
aardwolf,0.9
armadillo,0.9
platypus,0.5
zebra,0.1

例如,aardvark,1 计算为aardvark,10/10platypus,0.5 计算为platypus,5/10

问题

实现 shell 脚本以创建相对概率文件的最有效方法是什么?

约束

  • 单词和数字都没有顺序。
  • 没有主要的编程语言(例如 Perl、Ruby、Python、Java、C、Fortran 或 Cobol)。
  • 欢迎使用标准 Unix 工具,例如 awksedsort
  • 所有概率都必须与文件中的最高概率相关。
  • 单词是唯一的,数字不是。
  • 计数是自然数。

谢谢!

【问题讨论】:

  • @Marshall: bc 不是“bashcalc”,它是“台式计算器”,因为dc 是“台式计算器”。
  • @Dennis:谢谢,为您的困惑道歉

标签: bash math csv text-processing


【解决方案1】:
awk 'BEGIN{max=0;OFS=FS=","}  $NF>max{max=$NF}NR>FNR {print $1,($2/max) }' file file

【讨论】:

    【解决方案2】:

    无需两次读取文件:

    awk 'BEGIN {OFS = FS = ","} {a[$1] = $2} $2 > max {max=$2} END {for (w in a) print w, a[w]/max}' inputfile
    

    如果需要按单词排序的输出:

    awk ... | sort
    

    awk 'BEGIN {OFS = FS = ","} {a[$1] = $2; ind[j++] = $1} $2 > max {max=$2} END {n = asort(ind); for (i=1; i<=n; i++) print ind[i], a[ind[i]]/max}' inputfile
    

    如果需要按概率排序的输出:

    awk ... | sort -t, -k2,2n -k1,1
    

    【讨论】:

    • 不读取两次文件绝对是一种有效的方法。
    • 如果要格式化数字,可以将 {print w, a[w]/max} 替换为 {printf "%s,%.3f\n", w, a[w] /max}(保留 3 个尾随数字)
    【解决方案3】:

    这不是防错的,但这样的东西应该可以工作:

    #!/bin/bash
    
    INPUT=data.cvs
    OUTPUT=tally.cvs
    DIGITS=1
    
    OLDIFS=$IFS
    IFS=,
    
    maxval=0  # Assuming all $val are positive
    
    while read name val
    do
        if (( val > maxval )); then maxval=$val; fi
    done < $INPUT
    
    # Make sure $OUTPUT doesn't exist
    
    touch $OUTPUT
    
    while read name val
    do
        tally=`echo "scale=$DIGITS; result=$val/$maxval; if (0 <= result && result < 1) { print "0" }; print result" | bc`
        echo "$name,$tally" >> $OUTPUT
    done < $INPUT
    
    IFS=$OLDIFS
    

    借自this question,以及各种谷歌搜索。

    【讨论】:

    • bash 中读取 CSV 文件的一个很好的答案和一个很好的例子。不过,纯粹的awk 解决方案可能更有效。谢谢。
    • @Dave:kurumi 的明确道具
    猜你喜欢
    • 1970-01-01
    • 2022-10-09
    • 2020-10-12
    • 2019-03-17
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多