awk语句 – 如果没有找到(grep’ed)的话
发布时间:2020-12-14 01:56:58 所属栏目:Linux 来源:网络整理
导读:我的表文件示例看起来像那样 Name1 xxxxx 34Name1 xxxxx 37Name2 aaaaa 59Name2 xxxxx 90Name4 Name3 12 名称文件看起来像那样 Name1 Name2Name3Name4 我希望awk将Name1 / 2/3/4从Name文件匹配到表文件$1并打印$3的总和.如果找不到名称,则打印0 – 如何在awk
我的表文件示例看起来像那样
Name1 xxxxx 34 Name1 xxxxx 37 Name2 aaaaa 59 Name2 xxxxx 90 Name4 Name3 12 名称文件看起来像那样 Name1 Name2 Name3 Name4 我希望awk将Name1 / 2/3/4从Name文件匹配到表文件$1并打印$3的总和.如果找不到名称,则打印0 – 如何在awk中执行if语句? 我已经做了什么: for i in $(cat Name_file) do cat table | awk -v NAME="$i" '($1==NAME) {SUM+=$3} END {print NAME"t"SUM}' done 给出输出 Name1 71 Name2 149 Name3 Name4 12 它几乎是完美的 – 我想在Name3中添加0来获得这样的输出 Name1 71 Name2 149 Name3 0 Name4 12 这么多问题是:如果没有找到如何添加功能在awk? 解决方法
尝试这样的sg:
awk 'NR==FNR{a[$1]=0;next}$1 in a{a[$1]+=$3}END{for(i in a) print i,a[i]}' Name_file table 输出: Name1 71 Name2 149 Name3 0 Name4 12 在这种情况下,您不需要awk周围的bash循环.它首先读取Names_table然后一步处理所有表行.所以它更有效. 添加 或者纯粹的bash(> = 4.0)解决方案: printf -v tmp "[%s]=0 " $(<Name_file) declare -A htmp eval htmp=($tmp) while read a b c; do [ -n "${htmp[$a]}" ] && ((htmp[$a] += $c)); done <table for i in ${!htmp[*]}; do echo $i ${htmp[$i]}; done EXTENDED 扩展的问题是按$1和$2分组(并且Name_file包含表中的所有第一个键,因此不需要处理它). cat >table <<XXX Name1 xxxxx 34 Name1 xxxxx 37 Name2 aaaaa 59 Name2 xxxxx 90 Name4 Name3 12 XXX awk -v SUBSEP=,'{a[$1,$2]+=$3;++n[$1,$2]}END{for(i in a) print i,a[i],n[i]}' table 输出: Name2,xxxxx 90 1 Name2,aaaaa 59 1 Name4,Name3 12 1 Name1,xxxxx 71 2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |