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

  免費注冊 查看新帖 |

Chinaunix

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

如果替換匹配模式中的字符呢? [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-06-09 22:18 |只看該作者 |倒序瀏覽
有文件如下:
a,b,c,d,e,f,g,h,i,j
20090608,正常,張三,0,0,"213421223498 ", ,0,119.20,119.20
20090608,正常,李 三,1,0,"8974385498  ",  ,"23,195.77",0,"23,195.77"
20090608,正常,李四,0,0,"117412385446  ",  ,195.77,0,"24,195.54"
20090608,正常,李 三,0,0,"8974385498  ",  ,12.55,0,775.12
...
...
希望將后引號中數字的千分位分隔符去掉,
得到如下結果:
a,b,c,d,e,f,g,h,i,j
20090608,正常,張三,0,0,"213421223498 ", ,0,119.20,119.20
20090608,正常,李 三,1,0,"8974385498  ",  ,"23195.77",0,"23195.77"
20090608,正常,李四,0,0,"117412385446  ",  ,195.77,0,"24195.54"
20090608,正常,李 三,0,0,"8974385498  ",  ,12.55,0,775.12
...
...

[ 本帖最后由 MicroHard 于 2009-6-9 22:53 編輯 ]

論壇徽章:
0
2 [報告]
發(fā)表于 2009-06-09 22:49 |只看該作者
sed -e "s/[^.]\([1-9][0-9]*\),\([0-9]\{3\}\)/\1\2/g" a.txt

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亞洲杯之朝鮮
日期:2015-03-13 22:47:33IT運維版塊每日發(fā)帖之星
日期:2016-01-09 06:20:00IT運維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44
3 [報告]
發(fā)表于 2009-06-09 22:52 |只看該作者
try:
  1. awk -F \" -v OFS=\" '{for(i=1;i<=NF;i++) if(i%2==0)gsub(/,/,"",$i);print}' urfile
復制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2009-06-09 23:07 |只看該作者
原帖由 ppshw 于 2009-6-9 22:49 發(fā)表
sed -e "s/[^.]\([1-9][0-9]*\),\([0-9]\{3\}\)/\1\2/g" a.txt

這個遇到文件中"10,122,076.86"這樣的數字就出錯了,得到錯誤的:10122,076.86"
blackold的沒發(fā)現問題,不過好象運行有點慢。

[ 本帖最后由 MicroHard 于 2009-6-9 23:08 編輯 ]

論壇徽章:
0
5 [報告]
發(fā)表于 2009-06-09 23:20 |只看該作者

  1. awk -v RS="\"" 'NR%2==0{gsub(",","")}{printf (NR==1?"":"\"")$0}' URFILE
復制代碼

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亞洲杯之朝鮮
日期:2015-03-13 22:47:33IT運維版塊每日發(fā)帖之星
日期:2016-01-09 06:20:00IT運維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44
6 [報告]
發(fā)表于 2009-06-09 23:21 |只看該作者

回復 #4 MicroHard 的帖子

你的文件很大嗎?

對于特定的文件:
  1. sed ':n;s/\("[0-9]\+\),\([0-9.,]*"\)/\1\2/;tn' urfile
復制代碼

論壇徽章:
0
7 [報告]
發(fā)表于 2009-06-09 23:53 |只看該作者
$wc URFILE
45584  155232 5361840 URFILE
經過反復測試,結果還是blackold的awk最快,都差不多得到如下結果:
time awk -F \" -v OFS=\" '{for(i=1;i<=NF;i++) if(i%2==0)gsub(/,/,"",$i);print}' URFILE > bb
real    0m0.997s
user    0m0.951s
sys     0m0.045s


time awk -v RS="\"" 'NR%2==0{gsub(",","")}{printf (NR==1?"":"\"")$0}' URFILE > cc
real    0m1.125s
user    0m1.075s
sys     0m0.048s

time sed ':n;s/\("[0-9]\+\),\([0-9.,]*"\)/\1\2/;tn' URFILE > aa
real    0m3.039s
user    0m2.980s
sys     0m0.060s

論壇徽章:
0
8 [報告]
發(fā)表于 2009-06-10 00:35 |只看該作者
如果對1秒還不滿意,那就寫個C程序吧,我隨便寫了一個測試了一下,大概能比黑哥前面那個節(jié)省一半以上的時間。


  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.     char c, t=0;
  6.     FILE *fp = fopen("URFILE","rb");
  7.     while (1)
  8.     {
  9.         c=fgetc(fp);
  10.         if(c==EOF) break;
  11.         switch (c)
  12.         {
  13.             case '"': t=1-t; putchar(c); break;
  14.             case ',': if(!t) putchar(c); break;
  15.             default : putchar(c); break;
  16.         }
  17.     }
  18.     fclose(fp);
  19.     return 0;
  20. }
復制代碼

論壇徽章:
0
9 [報告]
發(fā)表于 2009-06-10 00:38 |只看該作者

  1. [root]# time ./mytr > /dev/null

  2. real    0m0.961s
  3. user    0m0.944s
  4. sys     0m0.017s

  5. [root]# time awk -F \" -v OFS=\" '{for(i=1;i<=NF;i++) if(i%2==0)gsub(/,/,"",$i);print}' tt > /dev/null

  6. real    0m3.308s
  7. user    0m3.281s
  8. sys     0m0.028s
復制代碼

論壇徽章:
0
10 [報告]
發(fā)表于 2009-06-10 00:57 |只看該作者

回復 #8 kwokcn 的帖子

學習了,
t為啥設成char型?
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP