藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教如何用shell實現這樣的SQL功能???

比如現在我有1萬行如下文本:
09/26/2004 SMDAP1126 161238 485 366 2 32
09/26/2004 CBSDEV02-UX 152242121 5548 2582 4709 36
09/26/2004 SMDAP1120 375711 6938 6691 21 31
09/26/2004 CBSDEV01-UX 84840926 2404 2481 1408 2385
09/26/2004 CBSDEV04SV 344955 25 9 1 0
09/26/2004 SMDAP1127 43878618 1454 215 434 0
09/27/2004 CBSDEV02-UX 181720181 5860 2577 5035 35
09/27/2004 SMDAP1126 175407 2656 234 2 2333
09/27/2004 SMDAP1120 706517 7675 7422 74 31
...........................

我想對文本按第1,2列進行匯總如下:
09/26/2004 SMDAP1126 20303 432321 5423 132 533
09/27/2004 SMDAP1126 30503 433321 1233 132 533
.......
09/26/2004 CBSDEV02-UX 4323 452 123 532
.........

即如果第1,2列相同,對3,4,5,6累加匯總,在數據庫中用select from group by很容易實現,可用shell/awk/sed如何實現?

急用,謝謝!!!

請教如何用shell實現這樣的SQL功能???

試著寫一個:
awk '{sum1[$1"x"$2]+=$3;sum2[$1"x"$2]+=$4;sum3[$1"x"$2]+=$5;sum4[$1"x"$2]+=$6;a[$1"x"$2]=$1" "$2}END{for(i in a) print a[i],sum1[i],sum2[i],sum3[i],sum4[i]}' file

請教如何用shell實現這樣的SQL功能???

發表於: 2005-01-27 11:01    發表主題:      

--------------------------------------------------------------------------------

試著寫一個:
awk '{sum1[$1"x"$2]+=$3;sum2[$1"x"$2]+=$4;sum3[$1"x"$2]+=$5;sum4[$1"x"$2]+=$6;a[$1"x"$2]=$1" "$2}END{for(i in a) print a[i],sum1[i],sum2[i],sum3[i],sum4[i]}' file

可是按這個所得結果中,並沒有求出和,都是0.

請教如何用shell實現這樣的SQL功能???

-->

bash-2.03$ cat file
09/26/2004 SMDAP1126 161238 485 366 2 32
09/26/2004 CBSDEV02-UX 152242121 5548 2582 4709 36
09/26/2004 SMDAP1120 375711 6938 6691 21 31
09/26/2004 CBSDEV01-UX 84840926 2404 2481 1408 2385
09/26/2004 CBSDEV04SV 344955 25 9 1 0
09/26/2004 SMDAP1127 43878618 1454 215 434 0
09/27/2004 CBSDEV02-UX 181720181 5860 2577 5035 35
09/27/2004 SMDAP1126 175407 2656 234 2 2333
09/27/2004 SMDAP1120 706517 7675 7422 74 31


bash-2.03$ awk '{sum1[$1"x"$2]+=$3;sum2[$1"x"$2]+=$4;sum3[$1"x"$2]+=$5;sum4[$1"x"$2]+=$6;a[$1"x"$2]=$1" "$2}END{for(i in a) print a[i],sum1[i],sum2[i],sum3[i],sum4[i]}' file
09/26/2004 CBSDEV01-UX 84840926 2404 2481 1408
09/26/2004 CBSDEV02-UX 152242121 5548 2582 4709
09/27/2004 CBSDEV02-UX 181720181 5860 2577 5035
09/26/2004 CBSDEV04SV 344955 25 9 1
09/26/2004 SMDAP1120 375711 6938 6691 21
09/27/2004 SMDAP1120 706517 7675 7422 74
09/26/2004 SMDAP1126 161238 485 366 2
09/27/2004 SMDAP1126 175407 2656 234 2
09/26/2004 SMDAP1127 43878618 1454 215 434

請教如何用shell實現這樣的SQL功能???

有現成的數據庫不用?!

請教如何用shell實現這樣的SQL功能???

shell比上帝還萬能:D

請教如何用shell實現這樣的SQL功能???

用正確的工具做正確的事情是王道啊:)

請教如何用shell實現這樣的SQL功能???

這在於怎麼理解unix中的每個工具的用途!
這些工具就好比一些積木,只有充分發揮它們各自的優勢,才能更好的完成任務!

請教如何用shell實現這樣的SQL功能???

To icesummit:
非常感謝你的腳本,太棒了!
只是有一點,不知如何用awk對時間這一列排序,數值沒問題,真怪!

To 寂寞烈火:
Q: 有現成的數據庫不用?!
A: 機器裡沒有數據庫,這不是數據庫產生的輸出結果. 所以icesummit的script幫我大忙!

謝謝各位,我的shell功底有點不好意思!

請教如何用shell實現這樣的SQL功能???

-->

要不你先拿sort把你的文件排序了再用awk?

請教如何用shell實現這樣的SQL功能???

即使排序了,awk的數組照樣亂,建議最後再排序,或在awk語句中排序。

請教如何用shell實現這樣的SQL功能???

to icesummit

能解釋一下"x"的作用嗎?

請教如何用shell實現這樣的SQL功能???

-->
我理解是作為連接符號用的,使$1x$2變成數組下標。

請教如何用shell實現這樣的SQL功能???

-->


man中好像沒有這樣的範例,具體是啥,還請高手解釋一下,很想知道。

請教如何用shell實現這樣的SQL功能???

lovecat說的是正確的,就是把$1和$2連接起來作為數組的下標.類似的用法再test上也有用到啊:
[[ x"$var" = x ] ]因為 $var 有可能為空,產生如下錯誤
[ = "" ]
所以在等號兩邊都加上相同的字符,以防止這樣的錯誤.

請教如何用shell實現這樣的SQL功能???

o ,謝謝icesummit 和lovecat 的解釋;)

請教如何用shell實現這樣的SQL功能???

是的,即使給awk的是排序後的,出來也亂了。
奇怪,我怎麼也按時間排不了第一列?對後面幾列用sort均可以呀!
.............
09/29/2004 CBSDEV02-UX 181720181 5860 2577 5035 35
09/22/2004 SMDAP1126 175407 2656 234 2 2333
09/27/2004 SMDAP1124 172487 2656 234 2 2333
...............

後來我乾脆對時間來排:
$ cat test2.log
04/02/2005
01/20/2005
01/23/2004
03/20/2004

$ cat test2.log |sort
01/20/2005
01/23/2004
03/20/2004
04/02/2005

$ cat test2.log |sort -k1
01/20/2005
01/23/2004
03/20/2004
04/02/2005

$ cat test2.log |sort -t/ -k3 -k1 -k2
01/23/2004
03/20/2004
01/20/2005
04/02/2005
最後這個就是我要的結果,可這方法也太笨了,誠如我自己一樣了,如果是下面的情況,該如何:

test1 01/02/2005 test11
test2 02/04/2004 test22
test3 03/02/2005 test33

請教如何用shell實現這樣的SQL功能???

http://www.lslnet.com/linux/#forum/viewtopic.php?t=488854&show_type=&start=0

參考一下吧,月經太頻繁人會受不了的 :D

請教如何用shell實現這樣的SQL功能???

悄悄問一聲,waker, are you a lady?

不過,你並沒有回答我的問題:
如何對時間這一序列排序:時間格式是(MM/DD/YYYY)
test1 01/02/2005 test11
test2 02/04/2004 test22
test3 03/02/2005 test33

請教如何用shell實現這樣的SQL功能???

在你貼出的例子中(第一帖),文本本來就是時間排序好的,你幹嘛要再排一次?
俺引用的那個帖子裡不是有不打亂原來數據次序的方法麼?



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com