加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读