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
时有什么区别?是的,使用$(