shell處理

今天老大讓我幫消費的數據,然後花了特別久的時間。其實就從mysql中查數據而言並沒有什麼難點。但是由於這些uid(幾千個)並不是所有都有消費的。有的sql查出來是空,這樣就有可能不會出現這個uid。而且因爲要查找兩個不同的月份,不一定這兩個月都有消費,所以跑出來的數據很難看。以及要區分pc和無線,又存在相同的情況。所以要進行補零。

我是這麼補零的,先跑一遍,生成一個result文件。用awk拿到這個文件中的所有的id,這裏比較容易

cat result | awk '{a[$1]+=0;}END{for(i in a) print i}' > file1 

跑出來之後呢,就要和原始的uid比較,看少了哪些uid,使用命令grep -vwf file1 uid> end,

這樣就可以找出缺少的uid。這行命令比較兩個文件的不同,和comm命令比,好處就是,兩個文件的區別和文字出現的順序無關。

找出來之後,每次做sql語句之前,用拿uid去這裏面找一遍。如果有,直接就造數據輸出。

不同月份的sql語句不一樣(老大要我查的東西不同),就用一個if語句。if [ "$3" = "12" ](一個空格不能少)then sql="xxx" else sql="xxx" fi ,生成結果放到不同的文件,再次去找uid,看是否有漏掉的uid,用同樣的方法解決。

ok,兩個文件都生成了。又有新的問題出現了,有的uid的pc有數據,無線沒數據。有的則相反,又要構造數據了。沒有數據的後幾位要填0。無線和pc用一個標誌位區分(0和1),最後的結果應該是0,1,0,1……這樣子分佈。所以就有寫了一行命令

cat info2015 | awk 'BEGIN{i=0} {if($3==i){print} else{print j"\t""2014-09-01""\t"1"\t"0"\t"0"\t"0"\t"0;i++;print};i++;i=i%2;j=$1}' > final2015 
大致造的數據是這一種格式。但是還完,因爲不一定0,1,0,1就是安全的。uid數目*2就應該等於行數。發現少了兩行,什麼情況?因爲有個別行缺了1,而他的下一個uid有恰好缺了0。這裏我就百度了比較上下兩行第一列是否相同的方法。結果時間太緊,我就沒仔細看。看着挺複雜。
所以就曲線救國吧。我先把上下兩行合併到一行,然後用awk去比對第一列和第八列(下一行的第一列出現在了第八列)。
合併:cat final2015|sed 'N;s/\n/ \t/' >system.txt


發佈了14 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章