我的表文件示例看起来像那样
Name1 xxxxx 34
Name1 xxxxx 37
Name2 aaaaa 59
Name2 xxxxx 90
Name4 Name3 12
Run Code Online (Sandbox Code Playgroud)
名称文件看起来像那样
Name1
Name2
Name3
Name4
Run Code Online (Sandbox Code Playgroud)
我想awk匹配Name1/2/3/4从Name文件到表文件$ 1和打印$ 3的总和.如果找不到名称打印 0 -我怎么可以做这样if的说法awk?
我已经做了什么:
for i in $(cat Name_file)
do
cat table | awk -v NAME="$i" '($1==NAME) {SUM+=$3} END {print NAME"\t"SUM}'
done
Run Code Online (Sandbox Code Playgroud)
给出输出
Name1 71
Name2 149
Name3
Name4 12
Run Code Online (Sandbox Code Playgroud)
这几乎是完美的-我想添加0到Name3获得这样的输出
Name1 71
Name2 149
Name3 0
Name4 12
Run Code Online (Sandbox Code Playgroud)
这么多问题是:如何if not found do在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
Run Code Online (Sandbox Code Playgroud)
输出:
Name1 71
Name2 149
Name3 0
Name4 12
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不需要awk周围的bash循环。它读取第一行,然后一步处理所有行。所以它更有效。Names_tabletable
添加
或者一个纯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
Run Code Online (Sandbox Code Playgroud)
扩展
扩展问题是按$1和进行分组$2(并且Name_file包含 中的所有第一个键table,因此实际上不需要处理)。
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
Run Code Online (Sandbox Code Playgroud)
输出:
Name2,xxxxx 90 1
Name2,aaaaa 59 1
Name4,Name3 12 1
Name1,xxxxx 71 2
Run Code Online (Sandbox Code Playgroud)