两道简单而不简单的shell题目

2011年10月20日 发表评论 阅读评论

偶然的一次从linuxtone上看到的两个题目,据说是百度的面度题目,看起来挺有意思的,现摘录下来供大家玩味下: 

题目1:
a文件内容

a a a a
b b b b
c c c c

b文件内容

1 1 1 1
2 2 2 2
3 3 3 3

将b文件内容插入到a文件内容的b b b b 下面,只依本题来看,可以做如下解法:

sed -i '2r b' a

这样似乎又有些不妥,这样的话是根据行数,来判断插入到那里,如果行数太多的话,难道要一行一行的去数,可以把写法改是这样:

sed -i '/b/r b' a 

当然,成能编辑器vi里操作也可以,打开a文件光标移到第二行,敲: r b就行了

题目2
内容如下:

[root@localhost ~]# cat test
zhangsan    80
lisi        81.5
wangwu      93
zhangsan    85
lisi        88
wangwu      97
zhangsan    90
lisi        92
wangwu      88

要求输出格式:(average:平均成绩,total:总成绩)

name#######average#######total
zhangsan     xxx          xxx
lisi         xxx          xxx
wangwu       xxx          xxx

大家来做做,越精简越好,呵呵。。。

繁琐易理解的方法:

echo -e "nametaveragettotal"
for i in  `awk '{print $1}' 1.txt|sort |uniq`
do
a=`grep $i 1.txt|awk '{print $NF}'|awk '{tot +=$1};END{print tot}'`
b=`grep $i 1.txt|awk '{print $NF}'|awk '{tot +=$1};END{print tot/2}'`
echo -e "$it$bt$a"
done

呵呵,是不是可以更简单点: 

awk '{a[$1]+=$2;b[$1]++};END{for(i in a)print i,a[i]/b[i],a[i]}' test.txt

规范下格式

awk 'BEGIN{print "name average total"}{a[$1]+=$2;b[$1]++};END{for(i in a)print i"t"a[i]/b[i]"t"a[i]}' test.txt|column -t



本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. jeffreyst
    2012年12月25日14:17 | #1

    cat c | sort | awk '{if(na==NULL) {na=$1;idx=1;sum=$2} else {if(na == $1) {sum+=$2;idx++;}else{print na, sum, sum/idx; na=$1; idx=1;sum=$2}}} END{print na, sum, sum/idx}'
    这样好像也可以实现第二个问题

  2. admin
    2012年12月25日22:51 | #2

    是的可以,实现问题的方法是多种多样的。不过输入关系反了,最后应该是 {print na,sum/idx,sum}