|
藍森林 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功能???
在你貼出的例子中(第一帖),文本本來就是時間排序好的,你幹嘛要再排一次?
俺引用的那個帖子裡不是有不打亂原來數據次序的方法麼? |
| |