awk语句-如果未找到(grep';ed),则执行

awk语句-如果未找到(grep';ed),则执行,awk,bash,Awk,Bash,我的表文件示例如下所示 Name1 xxxxx 34 Name1 xxxxx 37 Name2 aaaaa 59 Name2 xxxxx 90 Name4 Name3 12 文件名是这样的 Name1 Name2 Name3 Name4 我希望awk将Name1/2/3/4从名称文件匹配到表文件$1,并打印$3的总和如果找不到名称,则打印0-如何在awk中执行If语句 我已经做了: for i in $(cat Name_file) do cat tabl

我的表文件示例如下所示

Name1   xxxxx  34
Name1   xxxxx  37
Name2   aaaaa  59
Name2   xxxxx  90
Name4   Name3  12
文件名是这样的

Name1 
Name2
Name3
Name4 
我希望
awk
Name1/2/3/4
从名称文件匹配到表文件$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
这几乎是完美的-我想将
0
添加到
Name3
以获得这样的输出

Name1   71
Name2   149
Name3   0
Name4   12

这么多的问题是:如果未找到,如何添加
,在awk中执行
功能?

Y不需要任何“未找到”行为。您只是在计数之前没有正确初始化
SUM
变量。为此,请使用
BEGIN{SUM=0}

如果您需要显式地找到/未找到行为,请类似地执行。首先,初始化一些变量
开始{FOUND=0}
,然后在模式匹配上对其进行某种更改:
(…){FOUND=FOUND+1}
,最后用
测试它,如果(FOUND!=0)
尝试这样做:

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
Name2,xxxxx 90 1
Name2,aaaaa 59 1
Name4,Name3 12 1
Name1,xxxxx 71 2
在这种情况下,不需要循环。它首先读取
Names\u表
,然后一步处理
的所有行。所以它更有效

已添加

或纯(>=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
输出:

Name1 71
Name2 149
Name3 0
Name4 12
Name2,xxxxx 90 1
Name2,aaaaa 59 1
Name4,Name3 12 1
Name1,xxxxx 71 2

您的方法将打印所有行的总和,而不仅仅是列在名称中。您应该添加
(a中为$1)
条件以使其正常工作。而且它会以随机顺序打印计数,这可能是不需要的。@Vovanium:谢谢!补充。实际上,它不在规范中…:)@保尔加德尔:当然!您可以使用(伪)2D数组,如
a[$1,$2]
。那么,
Name\u文件
数组真的需要吗?如果
中有一行
$1
不是
名称\u文件
,怎么办?应该跳过吗?@PaulGardir:那么我不理解你最初的问题!怎么会出现键不在
表中的情况呢?@PaulGardir:我为你的另一个问题添加了一个可能的解决方案。我希望我能很好地解释你的评论。我可能会建议使用
$(你是说
表示我在$(
?你的建议和
阅读WORD;do command;done
时有什么区别?是的,使用
$(