|
藍森林 http://www.lslnet.com 2006年6月26日 11:18
請教大家,在線等!急!!!!!!!!!!
a文件格式為:
4/cmode00000000CFD,11/1234567890,71/20041220000520,72/20041220000520,74/2
4/cmode00000000CFD,11/1234567890,71/20041220000520,72/20041220000558,74/1101
。。。。。。。。
請教如何用awk語句把他轉換成 b文件,如下格式:
cmode00000000CFD |1234567890 |20041220000520|20041220000522|2|2|
cmode00000000CFD|1234567890|
20041220000520|20041220000558|38|1101|
.....
具體要求如下:
1:把a文件裡的","用"|"替代,同時a文件裡每行數據裡"4/"代表第4列。。。。,用awk語句的時候把4/,11/,71/去掉,直接把具體數據列出,並用"|"替換"," 。
2:
a文件裡的71/20041220000520,72/20041220000520, 是代表起始時間和結束時間,要求算出他們之間的時間差(單位:秒),在最後生成的b文件裡在其後把他們時間差列出來,如上面b文件裡的格式。
請教各位如何實現?謝謝! |
請教大家,在線等!急!!!!!!!!!!
難道真沒人會嗎? |
請教大家,在線等!急!!!!!!!!!!
簡單的替換還是sed方便點:
[code]
bash-2.05$ sed 's/^[0-9]*\///;s/\(,[0-9]*\/\)/|/g' filename
cmode00000000CFD|1234567890|20041220000520|20041220000520|2
cmode00000000CFD|1234567890|20041220000520|20041220000558|1101
bash-2.05$
[/code]
建議樓主看看致頂貼先。 |
請教大家,在線等!急!!!!!!!!!!
剛才寫錯了b文件格式:
第一行時間差我寫錯了,應該是:
請教如何用awk語句把他轉換成 b文件,如下格式:
cmode00000000CFD |1234567890 |20041220000520|20041220000520|0|2|
cmode00000000CFD|1234567890|
20041220000520|20041220000558|38|1101 |
請教大家,在線等!急!!!!!!!!!!
to ZealeS 精靈王:
先謝謝你了,還有個問題怎麼算出:20041220000520|20041220000520|之間的時間差呀,並在其後面列出來(單位:秒) |
請教大家,在線等!急!!!!!!!!!!
時間計算需要自己寫個函數,大概意思:
[code]
bash-2.05$ cat filename
4/cmode00000000CFD,11/1234567890,71/20041220000520,72/20041220000520,74/2
4/cmode00000000CFD,11/1234567890,71/20041220000520,72/20041220000558,74/1101
bash-2.05$ sed 's/^[0-9]*\///;s/\(,[0-9]*\/\)/|/g' filename | awk -F"|" 'BEGIN{a=20041220000520;while(getline){print $1"|"$2"|"$3"|"$4"|"$4-a"|"$5;a=$4}}'
cmode00000000CFD|1234567890|20041220000520|20041220000520|0|2
cmode00000000CFD|1234567890|20041220000520|20041220000558|38|1101
bash-2.05$
[/code] |
請教大家,在線等!急!!!!!!!!!!
to:ZealeS 精靈王.
你用的sed語句,一是最後一列後沒"|",二是沒算出兩個時間差,並列在後面,請問如何把這兩個功能也實現掉,謝謝!
有就是說先算出他們時間差,然後列出來,並在最後列後在上"|"
如下:
cmode00000000CFD|1234567890|20041220000520|20041220000520|0|2|
............ |
請教大家,在線等!急!!!!!!!!!!
在同一分鐘裡面才可以
[code]
bash-2.05$ sed 's/^[0-9]*\///;s/\(,[0-9]*\/\)/|/g' filename | awk -F"|" '{print $1"|"$2"|"$3"|"$4"|"$4-$3"|"$5"|"}'
cmode00000000CFD|1234567890|20041220000520|20041220000520|0|2|
cmode00000000CFD|1234567890|20041220000520|20041220000558|38|1101|
[/code]
不在同一分鐘裡面就不行,必須寫個類似數據庫datediff一樣的函數。 |
請教大家,在線等!急!!!!!!!!!!
[code]gawk 'BEGIN {FS="[,/]";OFS="|"}
{tis=$6;gsub(/../,"& ",tis);sub(/ /,"",tis);tis=mktime(tis);
tie=$8;gsub(/../,"& ",tie);sub(/ /,"",tie);tie=mktime(tie);
ti=tie-tis;
print $2,$4,$6,$8,$10,ti
}[/code] |
請教大家,在線等!急!!!!!!!!!!
來個自己計算時間,精確到天。
[code]
bash-2.05$ cat files
cmode00000000CFD|1234567890|20041220000520|20041220000520|2
cmode00000000CFD|1234567890|20041220000520|20041220000558|1101
cmode00000000CFD|1234567890|20041220000520|20041220010258|1102
cmode00000000CFD|1234567890|20041220000520|20041221000258|1103
cmode00000000CFD|1234567890|20041220000520|20041230000258|1104
cmode00000000CFD|1234567890|20041220000520|20041220000618|1105
bash-2.05$ awk -F"|" '{day=int(($4-$3)/1000000%100);if(day>24)day-=76;hor=int(($4-$3)/10000%100);\
if(hor>24)hor-=76;min=int(($4-$3)/100%100);if(min>60)min-=40;sec=int(($4-$3)%100);\
if(sec>60)sec-=40;print $1"|"$2"|"$3"|"$4"|"day*86400+hor*3600+min*60+sec"|"$5"|"}' files
cmode00000000CFD|1234567890|20041220000520|20041220000520|0|2|
cmode00000000CFD|1234567890|20041220000520|20041220000558|38|1101|
cmode00000000CFD|1234567890|20041220000520|20041220010258|3458|1102|
cmode00000000CFD|1234567890|20041220000520|20041221000258|86258|1103|
cmode00000000CFD|1234567890|20041220000520|20041230000258|863858|1104|
cmode00000000CFD|1234567890|20041220000520|20041220000618|58|1105|
bash-2.05$
[/code] |
請教大家,在線等!急!!!!!!!!!!
能否說具體點,函數名字都沒,這樣就好用,怎麼調用呢? |
請教大家,在線等!急!!!!!!!!!!
看得眼都花了 |
請教大家,在線等!急!!!!!!!!!!
to ZealeS
精靈王:
unix或liunx下有沒這個函數,能把字符串轉換成時間,然後自己把第3列和第4列相減呀,聽說有這個函數,不過我沒找到 |
請教大家,在線等!急!!!!!!!!!!
謝謝精靈王回答我的問題,
我聽別人說liunx和unix下自己有個什麼函數,可以把字符轉換成時間,然後把第4列和第3列相減,就是 時間差,不知道是否有這個函數? |
請教大家,在線等!急!!!!!!!!!!
to ZealeS
精靈王:
我想請教你下,你寫的程序裡,為什麼要判斷天數大於24呢?其他小時和分都好理解。
另外,你能否一下全部實現完,判斷完 年和月、日,小時、分、秒,
因為給的文件裡可能有這樣的起始時間和終止時間(跨年的):
cmode00000000CFD|1234567890|20041231235845|20050101000224|2 |
| |