awk语句 - 如果没有找到(grep'ed)的话

Pau*_*dir 6 awk

我的表文件示例看起来像那样

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)

这几乎是完美的-我想添加0Name3获得这样的输出

Name1   71
Name2   149
Name3   0
Name4   12
Run Code Online (Sandbox Code Playgroud)

这么多问题是:如何if not found do在awk中添加功能?

Tru*_*ueY 1

尝试像这样的 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)

在这种情况下,您不需要周围的循环。它读取第一行,然后一步处理所有行。所以它更有效。Names_tabletable

添加

或者一个纯 (>= 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)

  • 您的方法将打印所有行的总和,而不仅仅是名称中列出的总和。您应该添加 `($1 in a)` 条件才能正常工作。它还会以随机顺序打印计数,这可能是不需要的。 (2认同)