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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: ly5066113
打印 上一主題 下一主題

[學(xué)習(xí)共享] 文本編輯的一點心得--sed篇 [復(fù)制鏈接]

論壇徽章:
0
41 [報告]
發(fā)表于 2010-08-06 09:26 |只看該作者
sed命令在處理寬字節(jié)字符和長寬字節(jié)字符方面顯得比較吃力。

可以這樣說:這一點是sed的一塊短板。類似sed命令處理寬字節(jié)字

符和長寬字節(jié)字符顯得比較吃力的命令還有rev命令。

    如果遇到百萬級別的處理記錄。例如一份500W條記錄的郵箱地

址要求剔除里面含有非法字符的郵箱地址,保留正確合法的郵箱地址,

并把被剔除的非法郵箱地址也統(tǒng)計出來。如果這個500W條記錄的文

件里面不包含有寬字節(jié)字符或者長寬字節(jié)字符,則用sed和rev還算勉

強可以處理。如果這個500W條記錄的文件里面包含有寬字節(jié)和長寬

字節(jié)字符的記錄,用sed和rev一處理就會報錯。處理結(jié)果也不夠理想,

有些包含有寬字節(jié)字符和長寬字節(jié)字符的非法郵箱記錄根本就沒有被

篩選出來。

論壇徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年紀(jì)念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役紀(jì)念章
日期:2022-04-24 14:33:24
42 [報告]
發(fā)表于 2010-08-06 09:32 |只看該作者
前段時間要處理一個幾千萬行的文本,vi根本打不開,多虧了有sed,嘿嘿。

論壇徽章:
0
43 [報告]
發(fā)表于 2010-08-06 09:55 |只看該作者
好崇拜TIM。。。。!

論壇徽章:
1
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34
44 [報告]
發(fā)表于 2010-08-06 10:20 |只看該作者
路過幫頂

論壇徽章:
0
45 [報告]
發(fā)表于 2010-08-06 11:41 |只看該作者
學(xué)習(xí)之

論壇徽章:
0
46 [報告]
發(fā)表于 2010-08-06 15:00 |只看該作者
正在努力把awk和sed搞熟悉中。!

論壇徽章:
23
15-16賽季CBA聯(lián)賽之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午馬
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16賽季CBA聯(lián)賽之山東
日期:2017-12-21 16:39:1915-16賽季CBA聯(lián)賽之廣東
日期:2016-01-19 13:33:372015亞冠之山東魯能
日期:2015-10-13 09:39:062015亞冠之西悉尼流浪者
日期:2015-09-21 08:27:57
47 [報告]
發(fā)表于 2010-08-06 15:19 |只看該作者
感謝斑竹加精。


關(guān)于sed記數(shù),補充2個例子,均來自info sed中的examples(略有改動)

        例8:實現(xiàn) awk '{print NR,$0}' 的功能
  1. ly5066113@ubuntu:~$ head sed.info | awk '{print NR,$0}'
  2. 1 File: sed.info,  Node: Top,  Next: Introduction,  Up: (dir)
  3. 2
  4. 3 sed, a stream editor
  5. 4 ********************
  6. 5
  7. 6 This file documents version 4.1.5 of GNU `sed', a stream editor.
  8. 7
  9. 8    Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004 Free Software
  10. 9 Foundation, Inc.
  11. 10
  12. ly5066113@ubuntu:~$ head sed.info | sed -nf test.sed
  13. 1 File: sed.info,  Node: Top,  Next: Introduction,  Up: (dir)
  14. 2
  15. 3 sed, a stream editor
  16. 4 ********************
  17. 5
  18. 6 This file documents version 4.1.5 of GNU `sed', a stream editor.
  19. 7
  20. 8    Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004 Free Software
  21. 9 Foundation, Inc.
  22. 10
  23. ly5066113@ubuntu:~$ cat test.sed
  24. #! /usr/bin/sed -f
  25. x
  26. 1s/^/1/
  27. G
  28. s/\n/ /p
  29. s/ .*//
  30. /^9*$/s/^/0/
  31. s/.9*$/x&/
  32. h
  33. s/.*x//
  34. y/0123456789/1234567890/
  35. x
  36. s/x.*//
  37. G
  38. s/\n//
  39. h
復(fù)制代碼
x                              #交換pattern space與hold space,保存讀入的內(nèi)容
        1s/^/1/                        #如果是第一行,初始化行號1
        G                              #將保存的內(nèi)容追加回pattern space
        s/\n/ /p                       #將換行替換為空格,并打印
        s/ .*//                        #去處空格以后的所有內(nèi)容,pattern space只剩下行號
        /^9*$/s/^/0/                   #如果行號都為9,在前面補0
        s/.9*$/x&/                     #用x分隔不需要改變和需要改變的數(shù)字
        h                              #將pattern space中的內(nèi)容保存到hold space
        s/.*x//                        #刪除不需要改變的數(shù)字
        y/0123456789/1234567890/       #對數(shù)字進行 +1 的操作
        x                              #交換pattern space與hold space
        s/x.*//                        #刪除需要改變的數(shù)字
        G                              #將改變后的數(shù)字追加回pattern space
        s/\n//                         #刪除換行,得到新的行號
        h                              #保存新行號到hold space

        整體的思路:
        每讀入一行記錄,將保存在hold space中的行號(如果是第一行,需要初始化),和本行記錄合并輸出
        然后將行號 +1 ,保存至hold space

        代碼的核心部分就是實現(xiàn)“行號 +1”,具體做法:
        將行號分為2個部分,一部分保持不變(此部分可能沒有),一部分進行改變,然后將需要改變的部分進行處理
        將處理后的結(jié)果與前面不變的部分拼接在一起,形成新的行號,但這里有個情況需要考慮,就是進位
        我們已實際的例子來看看
        如果行號是 123
        那么首先將其分成2個部分變?yōu)?nbsp; 12x3
        x左邊的12不需要改變,x右邊的3需要變成4
        那么就對3進行y/0123456789/1234567890/的操作,將其變成4
        然后拼上前面的12變?yōu)?124
        如果行號是129(需要進位)
        那么首先將其分成2個部分變?yōu)?nbsp; 1x29
        x左邊的1不需要改變,x右邊的29需要變成30
        那么就對29進行y/0123456789/1234567890/的操作,將其變成30
        然后拼上前面的1變?yōu)?130
        這里面有個特殊情況需要考慮,就是如果行號都為9
        9, 99, 999 之類的情況,那么我們需要在前面加數(shù)字0用做進位用

        例9:實現(xiàn) wc -c 的功能
  1. ly5066113@ubuntu:~$ wc -c urfile
  2. 254 urfile
  3. ly5066113@ubuntu:~$ sed -nf test.sed urfile
  4. 254
  5. ly5066113@ubuntu:~$ cat test.sed
  6. #! /usr/bin/sed -f
  7. s/./a/g
  8. H
  9. x
  10. s/\n/a/
  11. : a;  s/aaaaaaaaaa/b/g; t b; b done
  12. : b;  s/bbbbbbbbbb/c/g; t c; b done
  13. : c;  s/cccccccccc/d/g; t d; b done
  14. : d;  s/dddddddddd/e/g; t e; b done
  15. : e;  s/eeeeeeeeee/f/g; t f; b done
  16. : f;  s/ffffffffff/g/g; t g; b done
  17. : g;  s/gggggggggg/h/g; t h; b done
  18. : h;  s/hhhhhhhhhh//g
  19. : done
  20. $! {
  21.         h
  22.         b
  23. }
  24. : loop
  25. /a/! s/[b-h]*/&0/
  26. s/aaaaaaaaa/9/
  27. s/aaaaaaaa/8/
  28. s/aaaaaaa/7/
  29. s/aaaaaa/6/
  30. s/aaaaa/5/
  31. s/aaaa/4/
  32. s/aaa/3/
  33. s/aa/2/
  34. s/a/1/
  35. y/bcdefgh/abcdefg/
  36. /[a-h]/ b loop
  37. p
復(fù)制代碼
此段代碼雖然看起來煩瑣,但思路卻比上一例好理解。
        每讀一行數(shù)據(jù),將里面所有的字符都替換成字母a,因為sed讀數(shù)據(jù)時會將換行符(\n)去掉
        所以我們利用H命令產(chǎn)生的\n將其補充回來,也替換成字母a,統(tǒng)一做字符統(tǒng)計
        為了節(jié)省內(nèi)存開銷,提高效率,這里做了進位的處理,就是將10個a替換成1個b,10個b替換成1個c 。。。
        這樣到最后,字母a的個數(shù)就代表個位數(shù)字,字母b的個數(shù)就代表十位數(shù)字,字母c的個數(shù)代表百位數(shù)字。。。
        如果最后剩下是這樣一串字符:
        ccbbbbbaaaa
        那么就表示總共的字符數(shù)為:254
        本段代碼的統(tǒng)計是有上限的,如果字符數(shù)量超過1億,將無法得到正確結(jié)果
        可以通過增加替換的次數(shù)來增加統(tǒng)計上限,如 s/hhhhhhhhhh/i/g , s/iiiiiiiiii/j/g 。。。

論壇徽章:
0
48 [報告]
發(fā)表于 2010-08-06 15:27 |只看該作者
再學(xué)習(xí)

論壇徽章:
1
巨蟹座
日期:2014-06-04 13:33:30
49 [報告]
發(fā)表于 2010-08-06 15:41 |只看該作者
回復(fù) 47# ly5066113


    其實你應(yīng)該開新帖,否則只有1/4的人看得到

論壇徽章:
2
巳蛇
日期:2014-10-26 22:38:12天蝎座
日期:2016-01-08 09:25:17
50 [報告]
發(fā)表于 2010-08-07 10:22 |只看該作者
好文,學(xué)習(xí)sed
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP