题目:对两个文件A[用户id,操作次数]及文件B[用户id,性别],合并得到C[用户id,操作次数,性别],并统计出男女用户操作所占的比例
方法:用shell脚本实现
1:添加两个文件中的值,A文件:
id1 4
id2 5
id6 2
id0 4
id4 0
id3 2
id7 4
B文件:(m代表男,w代表女)
id3 m
id1 w
id7 m
id2 m
id4 w
id6 w
id0 w
2:最终的命令为:
#!/bin/bash
filenameA="/shell/A"
filenameB="/shell/B"
filenameC="/shell/C"
filesortA="filenameA.sort"
filesortB="filenameB.sort"
sort $filenameA > $filesortA
sort $filenameB > $filesortB
join $filesortA $filesortB > /shell/C
awk '{if($3=="w")print $2}' /shell/C > /shell/D
awk '{sum+=$1}END{print sum}' /shell/D > /shell/F
awk '{if($3=="m")print $2}' /shell/C > /shell/E
awk '{sum+=$1}END{print sum}' /shell/E >> /shell/F
awk '{sum+=$2}END{print sum}' /shell/C >> /shell/F
num1=$(sed -n 1p /shell/F)
num2=$(sed -n 2p /shell/F)
num3=$(sed -n 3p /shell/F)
echo "the woman is $num1/$num3"
echo "the man is $num2/$num3"
执行shell脚本的到的结果 [root@master ~]# /shell/shell10
the woman is 10/21
the man is 11/21
下面说明下上面的命令
filenameA,
filesortA
上面两个文件为程序中的变量,为临时变量,在系统中不显示
sort $filenameA > $filesortA
sort $filenameB > $filesortB
此命令将filenameA文件中的内容进行排序,默认按照第一列排序,将排序结果存储到filesortA文件中
join $filesortA $filesortB > /shell/C
将排序后的两个文件进行合并,并将合并结果存储到/shell/C文件中,结果如下:
id0 4 w
id1 4 w
id2 5 m
id3 2 m
id4 0 w
id6 2 w
id7 4 m
awk '{if($3=="w")print $2}' /shell/C > /shell/D
匹配C文件中的第三列为w的第二列的值,保存到D文件中,此时D文件只有一列,结果如下:
4
4
0
2
awk '{sum+=$1}END{print sum}' /shell/D > /shell/F
计算D文件中第一列值的和,保存到F文件中,
awk '{if($3=="m")print $2}' /shell/C > /shell/E
匹配C文件中的第三列为m的第二列的值,保存到E文件中,此时E文件只有一列,结果如下:
5
2
4
awk '{sum+=$1}END{print sum}' /shell/E >> /shell/F
匹配E文件中第一列的所有值的和,将结果续写到F文件中
awk '{sum+=$2}END{print sum}' /shell/C >> /shell/F
计算C文件中第二列所有值的和,续写到F文件中,F文件中的内容如下:
10
11
21
10为w的所有操作之和,11为性别m的所有操作之和,21为总的操作之和
num1=$(sed -n 1p /shell/F)
为取出F文件中第一行的值,并存储到变量num1中,然后进行计算,得出模拟结果
注:次方法个人感觉不是最好的方法,如果有好的建议可以交流!