亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 請(qǐng)教shell求和方法 [打印本頁(yè)]

作者: lvyuancyx    時(shí)間: 2011-04-17 16:54
標(biāo)題: 請(qǐng)教shell求和方法
有一個(gè)文件cat abc
1 10
3 20
1 50
5 20
20 46
5  40


想實(shí)現(xiàn)這樣的功能:
第一列按照1 3 5 10 20 排序,第二列進(jìn)行求和.
如果第一列的值不存在,則第二列補(bǔ)充為0.
即最后想要的的結(jié)果是:

1 60
3 20
5 60
10 0
20 46

請(qǐng)教怎么解決?
作者: db2-zhang    時(shí)間: 2011-04-17 17:38
回復(fù) 1# lvyuancyx


    請(qǐng)問(wèn) 一下! 在你第一列中沒(méi)有的數(shù)字,你問(wèn)什么還要加入!

  我這寫(xiě)了個(gè)第一列沒(méi)有10的:

echo '1 10
3 20
1 50
5 20
20 46
5  40'|awk '{a[$1]+=$2}END{for(i in a)print i"\t"a}'|sort -n -k 1
1       60
3       20
5       60
20      46
作者: lvyuancyx    時(shí)間: 2011-04-17 17:51
本帖最后由 lvyuancyx 于 2011-04-17 18:04 編輯

回復(fù) 2# db2-zhang


    因?yàn)榻y(tǒng)計(jì)數(shù)據(jù)中需要10的數(shù)據(jù),可能在某一天里卻沒(méi)有這個(gè)10的數(shù)據(jù).所以要填成0.

我寫(xiě)了一個(gè)但是不夠精簡(jiǎn),所以想求更好的方法

for val in 1 3 5 10 20
do
awk '{print $1}' abc |grep -w $val >/dev/null 2>&1
if [ $? -eq 0 ];then
awk -v vv=$val  '{if($1==vv){a[$1]+=$2}}END{for(i in a) print i,a}' abc
else
echo $val 0
fi
done
作者: jason680    時(shí)間: 2011-04-17 19:45
回復(fù)  db2-zhang


    因?yàn)榻y(tǒng)計(jì)數(shù)據(jù)中需要10的數(shù)據(jù),可能在某一天里卻沒(méi)有這個(gè)10的數(shù)據(jù).所以要填成0.
...
lvyuancyx 發(fā)表于 2011-04-17 17:51



$ echo '1 10
3 20
1 50
5 20
20 46
5  40' | perl -lane 'BEGIN{$h{$_}=0 for(1,3,5,10,20)}{$h{$F[0]}+=$F[1]}END{for(sort{$a<=>$b}keys %h){print "$_\t$h{$_}"}}'
1        60
3        20
5        60
10        0
20        46
作者: jason680    時(shí)間: 2011-04-17 22:19
本帖最后由 jason680 于 2011-04-18 11:10 編輯

只用awk的來(lái)實(shí)現(xiàn),難真累人....
$ echo '1 10
3 20
1 50
5 20
20 46
5 40 ' |awk 'BEGIN{a["01"]=a["03"]=a["05"]=a[10]=a[20]=0}
{a[sprintf("%02s",$1)]+=$2}
END{n=asorti(a,s);for(t=1;t<=n;t++)printf("%d\t%s\n",s[t],a[s[t]])}'
1        60
3        20
5        60
10        0
20        46
作者: cjaizss    時(shí)間: 2011-04-17 22:39
  1. awk '{a[$1]+=$2;b[$1]=$1;}END{x=asort(b);for(i=1;i<=x;i++)print b[i],a[b[i]]}'
復(fù)制代碼

作者: yinyuemi    時(shí)間: 2011-04-18 01:38
回復(fù) 1# lvyuancyx
  1. echo "1 10
  2. 3 20
  3. 1 50
  4. 5 20
  5. 20 46
  6. 5  40" |awk 'NF==2{a[$1]+=$2;next}{print $1,a[$1]?a[$1]:"0"}' - <(echo "1
  7. 3
  8. 5
  9. 10
  10. 20")
  11. 1 60
  12. 3 20
  13. 5 60
  14. 10 0
  15. 20 46
復(fù)制代碼

作者: 昭襄王    時(shí)間: 2011-04-18 09:08
這個(gè)就應(yīng)該用蠻力解決,別為了一個(gè)特殊情況考慮算法
,直接把第一列必須有的數(shù)字追加到文件里,
然后就是求和了
作者: 南極雨    時(shí)間: 2011-04-18 10:55
同意樓上的...
作者: blackold    時(shí)間: 2011-04-18 10:56
學(xué)習(xí)學(xué)習(xí)!
作者: xiaopan3322    時(shí)間: 2011-04-18 13:48
這個(gè)就應(yīng)該用蠻力解決,別為了一個(gè)特殊情況考慮算法
,直接把第一列必須有的數(shù)字追加到文件里,
然后就是 ...
昭襄王 發(fā)表于 2011-04-18 09:08



   
    大王英明




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2