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

  免費注冊 查看新帖 |

Chinaunix

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

關(guān)于sed計數(shù) [復(fù)制鏈接]

論壇徽章:
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
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-08-14 12:54 |只看該作者 |倒序瀏覽
本帖最后由 ly5066113 于 2010-08-14 13:27 編輯

關(guān)于sed的計數(shù),在我的心得帖(http://bbs3.chinaunix.net/viewthread.php?tid=1762006)里面補充了3個例子,可能很多人沒有看到,在這里重發(fā)下,看懂了這3個例子,相信大家對sed的計數(shù)不在會有任何問題。



        例8:實現(xiàn) awk '{print NR,$0}' 的功能
        來自info sed中的examples(略有改動)
  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 的功能
        來自info sed中的examples(略有改動)
  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 。。。

        例10:實現(xiàn) awk '{sum+=$1}END{print sum}'
        http://sed.sourceforge.net/grabbag/scripts/add_decs.sed
  1. ly5066113@ubuntu:~$ seq 100 | awk '{sum+=$1}END{print sum}'
  2. 5050
  3. ly5066113@ubuntu:~$ seq 100 | sed -nf test.sed
  4. 5050
  5. ly5066113@ubuntu:~$ seq 1000 | awk '{sum+=$1}END{print sum}'
  6. 500500
  7. ly5066113@ubuntu:~$ seq 1000 | sed -nf test.sed
  8. 500500
  9. ly5066113@ubuntu:~$ cat test.sed
  10. #! /usr/bin/sed -f

  11. # This is an alternative approach to summing numbers,
  12. # which works a digit at a time and hence has unlimited
  13. # precision.  This time it is done with lookup tables,
  14. # and uses only 10 commands.

  15. G
  16. s/\n/-/
  17. s/$/-/
  18. s/$/;9aaaaaaaaa98aaaaaaaa87aaaaaaa76aaaaaa65aaaaa54aaaa43aaa32aa21a100/

  19. :loop
  20. /^--[^a]/!{
  21.         # Convert next digit from both terms into analog form
  22.         # and put the two groups next to each other
  23.         s/^\([0-9a]*\)\([0-9]\)-\([^-]*\)-\(.*;.*\2\(a*\)\2.*\)/\1-\3-\5\4/
  24.         s/^\([^-]*\)-\([0-9a]*\)\([0-9]\)-\(.*;.*\3\(a*\)\3.*\)/\1-\2-\5\4/

  25.         # Back to decimal, but keeping the carry in analog form
  26.         # \2 matches an `a' if there are at least ten a's, else nothing
  27.         #
  28.         #    1-------------                       3-      4----------------------
  29.         #                        2                                                5----
  30.         s/-\(aaaaaaaaa\(a\)\)\{0,1\}\(a*\)\([0-9]*;.*\([0-9]\)\3\5\)/-\2\5\4/
  31.         b loop
  32. }
  33. s/^--\([^;]*\);.*/\1/
  34. h
  35. $p
復(fù)制代碼
這段代碼很巧妙,先是將需要相加的2個數(shù)字替換成對應(yīng)的字母a的個數(shù),然后將字母a合并在一起,
        在替換回相加后的結(jié)果數(shù)字,如果超過10就保留一個a表示進位。
        例如:123 + 456
        那么就先將3和6替換成aaa和aaaaaa,然后合并aaaaaaaaa
        這樣在利用lookup table將aaaaaaaaa替換成9,就完成了加法的操作
        如果 125 + 456
        5和6相加最后就會變?yōu)閍1,字母a回會在計算2加5的時候一并計算
        這樣也就實現(xiàn)了進位。

評分

參與人數(shù) 2可用積分 +4 收起 理由
expert1 + 2 強大,不好理解。
badb0y + 2 收藏,回家慢慢看

查看全部評分

論壇徽章:
0
2 [報告]
發(fā)表于 2010-08-14 13:08 |只看該作者

論壇徽章:
0
3 [報告]
發(fā)表于 2010-08-14 13:10 |只看該作者
看基本能看懂,關(guān)鍵是自己應(yīng)用的時候想不到是這樣,或者不能變通,真是思想有多遠(yuǎn),就能走多遠(yuǎn)阿

論壇徽章:
0
4 [報告]
發(fā)表于 2010-08-14 13:17 |只看該作者
沒錯~以后大家Oracle或SQL方面有需求~ 等我水平高了也寫一寫感想HOHO~

論壇徽章:
0
5 [報告]
發(fā)表于 2010-08-16 10:37 |只看該作者
up

論壇徽章:
16
IT運維版塊每日發(fā)帖之星
日期:2015-08-24 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-10-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-11-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT運維版塊每日發(fā)帖之星
日期:2016-04-15 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-21 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-08-16 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-14 06:20:00
6 [報告]
發(fā)表于 2010-08-16 15:22 |只看該作者
回復(fù) 3# bbgg1983


    你這個“思想有多遠(yuǎn)”很經(jīng)典啊,現(xiàn)在感覺瓶頸就是“想不到”,O(∩_∩)O哈哈~,看別人寫的又感覺不是那么復(fù)雜。

論壇徽章:
0
7 [報告]
發(fā)表于 2010-08-16 15:35 |只看該作者
mark下

論壇徽章:
0
8 [報告]
發(fā)表于 2010-10-03 18:19 |只看該作者
回復(fù) 2# shileiadmin


    頂! 雖然半天才理解!

論壇徽章:
0
9 [報告]
發(fā)表于 2010-10-03 22:02 |只看該作者
還是看不懂
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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