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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 12812 | 回復(fù): 12
打印 上一主題 下一主題

shell腳本--對(duì)原文件的每行記錄操作,寫入到新文件,速度運(yùn)行慢,請(qǐng)大蝦指點(diǎn) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-05-14 19:49 |只看該作者 |倒序?yàn)g覽
一個(gè)文本處理的腳本,數(shù)據(jù)量比較大,運(yùn)行速度慢,希望大蝦們指點(diǎn)
源文件大概如下:
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
01|02|03|04|05
……
原始文件大小不確定,以50萬行為例

目標(biāo)文件要求如下:
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05
abc|20110514000000|01|03|05    注:第二個(gè)字段20110214000000是取當(dāng)前操作時(shí)間
……
50萬行

源文件每一行的記錄以'|'為字段分隔符,要求取出第1,3,5個(gè)字段,并在新的記錄前插入abc和20110514000000(當(dāng)前操作時(shí)間)兩個(gè)字段。
還要求目標(biāo)文件不能超出指定大小,如果超出則寫入新文件。并且生成文件名從0000-9999序號(hào)來生成。例:abcdef_0000.dat 到 abcdef_9999.dat
我的思路是
nowtime=`date +%Y%m%d%H%M%S`
for record in $(cut -d '|' -f1,3,5 源文件名)
do
   echo "abc|$nowtime|取出字段“  >  目標(biāo)文件
   if  超出指定大小
   then
         新建目標(biāo)文件
   fi
done

現(xiàn)在的問題是
1.如果在插入一行后,怎樣判斷目標(biāo)文件的大小是否超出。
2.如果源文件數(shù)據(jù)量比較大,一行一行的操作會(huì)比較慢,而且每插入一行,還要判斷是否
超出指定大小,這樣肯定比較費(fèi)時(shí),有沒有批量執(zhí)行的命令或則更快的命令?
3.可不可以在插入完后,判斷文件的大小,用split命令來按照規(guī)定的文件大小來分割,
也就是  “if  超出指定大小”這個(gè)判斷放在for循環(huán)的外面,但如果是這樣的話,文件名
又比較難生成。因?yàn)閟plit分割的文件是從1開始遞增的,那如果我現(xiàn)在的文件流水號(hào)是5
那么操作起來就比較麻煩。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-05-14 20:14 |只看該作者
自己來頂一個(gè)

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-05-14 20:21 |只看該作者
本帖最后由 南極雨 于 2011-05-14 20:26 編輯

回復(fù) 1# C307307


    這樣肯定慢...用awk和sed吧
備份原文件。!
  1. nowtime=`date +%Y%m%d%H%M%S`;sed "s/^/abc\|$nowtime/" file | awk '{print $1,$2,$4,$5,$6}'
復(fù)制代碼
  1. nowtime=`date +%Y%m%d%H%M%S`;sed -e "s/\(.*\)|02\(.*\)/\1\2/;s/^/abc|$nowtime/" file
復(fù)制代碼
-e可以刪除,第二個(gè)應(yīng)該比第一個(gè)快點(diǎn)兒

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-05-14 20:37 |只看該作者
謝謝樓上,我去試試。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-05-14 20:54 |只看該作者
第一個(gè)代碼我沒看明白,前面的sed是在每行前面插入字段,那后面這個(gè)awk是做什么用的,而且這個(gè)管道命令貌似沒用。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-05-14 20:59 |只看該作者
麻煩南極雨說明下,第二個(gè)代碼的這個(gè)  "s/\(.*\)|02\(.*\)/\1\2/ 是做什么用的?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2011-05-14 21:24 |只看該作者
第二個(gè)段代碼明白了,就是去掉了“|02”這個(gè)字段

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2011-05-14 21:56 |只看該作者
回復(fù) 5# C307307


也是去掉    “|02”這個(gè)字段

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-05-15 10:39 |只看該作者
本帖最后由 ywlscpl 于 2011-05-15 10:43 編輯

我想樓主說的源文件中內(nèi)容可能并不是像舉例的那樣內(nèi)容都是一樣的,那么按文件大小來分割得話只能用split了
  1. awk -F '|' -v time=`date +%Y%m%d%H%M%S` '{print "abc|"time"|"$1"|"$3"|"$5}' file >file1
  2. split -b 5M -d file1
  3. ls x0* |awk -Fx '{d=sprintf("%04d",$2);system("mv "$0" abcdef_"d".dat")}'
  4. rm -f file1
復(fù)制代碼
ywlscpl@ubuntu:~$ split --version
split (GNU coreutils) 6.10
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund and Richard M. Stallman.

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-05-15 11:58 |只看該作者
謝謝ywlscpl:
樓上理解的正是,另外文件分割的流水號(hào)問題也幫我解決了。
另謝謝南極雨。

Ps:
1.nowtime=`date +%Y%m%d%H%M%S`;sed  "s/\(.*\)|\(.*\)|\(.*\)|\(.*\)|\(.*\)/\1|\3|\5/;s/^/abc|$nowtime|/" file > file1

2.awk -F '|' -v time=`date +%Y%m%d%H%M%S` '{print "abc|"time"|"$1"|"$3"|"$5}' file >file1

兩段代碼的運(yùn)行速度都很快阿 ,31萬條記錄,第一端代碼用了5秒左右,第二段代碼稍快一點(diǎn),2秒左右。
但是輸出標(biāo)準(zhǔn)輸出的話第一個(gè)稍快,20秒左右,第二個(gè)25秒左右。(自己統(tǒng)計(jì)的,文本內(nèi)容不一樣的話,時(shí)間可能會(huì)有所偏差。)
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP