【问题标题】:Parsing CSV to print line with highest score using bash shell使用 bash shell 解析 CSV 以打印得分最高的行
【发布时间】:2012-03-30 11:40:07
【问题描述】:

我有一个这样的 CSV

Parameter Values,Count,% of Results
" david;dd@gmail.com;10300 "," 15 "," 50.0% "
" david;dd@gmail.com;12300 "," 15 "," 50.0% "
" davidk;dk@gmail.com;32300 "," 15 "," 50.0% "
" joe;joe@gmail.com;9200 "," 15 "," 50.0% "
" john;jj@gmail.com;1500 "," 15 "," 50.0% "

我想获取数值最高的行,在本例中为 32300

我已经尝试过了,但它使用了几个命令

export max=$(awk -F, '{split($1,a,";"); print a[3] }' contestEntryTest.csv | tr -d ' "' | sort -nr | head -n 1) ; grep $max contestEntryTest.csv

我如何用更少的命令或一个命令完成上述操作,经验丰富的 bash 程序员如何解决上述问题,只是为了学习经验。 干杯!

【问题讨论】:

    标签: linux bash parsing csv awk


    【解决方案1】:

    可以使用排序,如果文件是demo.csv,那么

    sort -t ';' -k3 -n demo.cvs|tail -n 1
    

    【讨论】:

    • 哇,这很简单,谢谢你的回答。我只是想知道 sort 或 awk 哪个性能最好,或者可以忽略不计。
    • @tsukimi 我认为性能取决于数据的大小/内容,sort 会处理所有条目,但 awk 处理脚本更复杂,所以很难说谁更快。
    【解决方案2】:

    一个纯粹的 awk 方法来解决这个问题:

    awk -F"[; ]" '($4>v){v=$4}END{print v}' FILE
    

    【讨论】:

    • 我把它改成了awk -F"[; ]" '(NR>1 && $4>v){v=$4}END{print v}' contestEntryTest.csv 这只打印出值而不是值所在的整行
    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2022-11-27
    相关资源
    最近更新 更多