如果用户以字符串形式输入员工详细信息,并且我们希望输出显示部门的平均工资,并且输出应该与它们在输入字符串中出现的顺序相同。
例如输入字符串:
EMP101:Jack:HR:6000#EMP102:Jill:Management:10000#EMP103:Russell:Testing:10000#EMP104:Monica:HR:15000#EMP105:John:Management:25000#EMP106:Ram:Testing:8000#EMP107:Tan:HR:15000#EMP108:Harry:Management:10000
输出字符串:
HR:12000#Management:15000#Testing:9000
我尝试了以下代码:
echo "EMP101:Jack:HR:6000#EMP102:Jill:Management:10000#EMP103:Russell:Testing:10000#EMP104:Monica:HR:15000#EMP105:John:Management:25000#EMP106:Ram:Testing:8000#EMP107:Tan:HR:15000#EMP108:Harry:Management:10000" \
| awk 'BEGIN{RS="#"; OFS=FS=":"} {gsub(/"\n$/,"",$5); print $3,$4}' \
| awk -F ":" '{a[$1] += $2} {b[$1] += 1} END{for (i in a) print i, a[i]/b[i]}' \
| tr " " ":" \
| tr "\n" "#";
得到的输出为:
:0#Testing:9000#Management:15000#HR:12000
这不是我想要的,我也不明白为什么:0#
要在字符串的开头添加。谁能告诉我如何在shell脚本中实现这一点
使用 any
awk
并保留顺序:输出:
我们使用
ordrDept
数组通过他们看到的顺序来记住每个部门的顺序。我们使用
dept
数组来总结每个部门的总工资。我们使用
seenDept
数组来记住他们被看到了多少次。在
END{...}
块中,并且i
将是我们访问的现有部门的最大数量ordrDept[++i]=$3
,然后我们按照我们首先访问的顺序打印它们,然后是每个部门ordrDept[o]
的平均工资计算,并且我们正在控制分隔符。total/count
(i==o)?ORS:RS
具有更有意义的变量名称的上述方法的替代实现将是(感谢@EdMorton):
主题的另一种变体
输出
这
:0#
是由于您的输入/文件中有一个额外的尾随空行。gsub(...)
由于您提供了错误的模式以及不存在的字段,因此您尝试删除它失败了。更正它,或使用扩展RS
变量。因为awk
它本身就很强大,不需要运行那堆管道;只做一个awk
。尝试
删除尾随 ORS 留给读者作为练习。
这是使用perl的一种方法。
涉及的数据结构:
以下是您尝试的方法
给出了 GNU sed 方法。这个想法是将同一部门和空间集中在一起,将同一部门内的工资分开。