【问题标题】:match records of a file with field values of another file in awk将文件的记录与 awk 中另一个文件的字段值匹配
【发布时间】:2014-01-20 14:37:07
【问题描述】:

我想总结 CSV 文件字段中的值 应通过读取另一个文件来检查匹配的位置, 假设我们有 CSV_file:

adam,18
denis,19
julie,17
adam,15
max,20
julie,19

和一个简单的 txt 文件,其中包含:

adam
julie

我只需要总结 18,15,17,19 我怎么能用 awk 轻松做到这一点?

【问题讨论】:

    标签: bash file csv scripting awk


    【解决方案1】:
    awk 'NR==FNR{ s[$1]+= $2; next} {t+=s[$1]} END{ print t}' FS=, csv-file names.txt
    

    【讨论】:

    • 在我的 Ubuntu 上,这给出了 69。您使用的是什么 awk 版本和系统?
    • 我知道这是从哪里来的工作了 有什么问题? ... awk 'NR==FNR{ s[$3]+= $5;下一个} {t+=s[$3]} END{ 打印 t}'
    • @user3144923,names.txt 也是多列吗?我想你想要awk 'NR==FNR{s[$3]+=$5;next}{t+=s[$1]}...',但没有更多信息很难说。
    【解决方案2】:

    假设names.txt 是:

    adam
    julie
    

    values.txt 是:

    adam,18
    denis,19
    julie,17
    adam,15
    max,20
    julie,19
    

    然后您可以使用grep-f 标志,它从文件中读取模式,每行一个模式,并从values.txt 返回匹配任何模式的所有行。然后我们只需使用awk 解析出数字并求和:

    grep -f names.txt values.txt | \
    awk 'BEGIN{FS=",";total=0}{total+=$2}END{print total}'
    

    【讨论】:

    • 谢谢,在浮点运算中如何将总数除以一个数字?
    • awk 'BEGIN{FS=",";total=0}{total+=$2}END{print total/<your denominator here>}', awk 如果表达式不计算为整数,则默认为浮点运算
    • 不幸的是,总数和分母都是整数......除法结果是浮点数,但我把它四舍五入到 0
    • 你期望的输出是什么,你得到的输出是什么
    • 还注意到我已经回答了此时提出的问题,我们正在谈论的是一个完全不同的主题(浮点运算)
    猜你喜欢
    • 2011-04-26
    • 2021-08-05
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多