少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          1、sed使用手冊(轉載) 

          sed使用手冊(轉載) 
          發信站: BBS 水木清華站 (Wed Sep 25 21:06:36 2002), 站內信件 
           
           
           
            Sed 命令列可分成編輯指令與文件檔部份。其中 , 編輯指令負責控制所有的編 
          輯工作 ; 文件檔表示所處理的檔案。  
            sed 的編輯指令均由位址(address)與函數(function)兩部份組成 , 其中 , 在 
          執行時 , sed 利用它的位址參數來  
            決定編輯的對象;而用它的函數參數(解[3])編輯。   
            此外 , sed 編輯指令 , 除了可在命令列上執行 , 也可在檔案內執行。其中差 
          別只是在命令列上執行時 , 其前必  
            須加上選項 -e ; 而在檔案(解[4])內時 , 則只需在其檔名前加上選項 -f。另 
          外 , sed 執行編輯指令是依照它  
            們在命令列上或檔內的次序。   
           
            下面各節 , 將介紹執行命令列上的編輯指令 、sed 編輯指令、執行檔案內的編 
          輯指令、執行多個檔案的編輯、及  
            執行 sed 輸出控制。   
           
          2.1 執行命令列上的編輯指令   
          2.2 sed 編輯指令   
          2.3 執行檔案內的編輯指令   
          2.4 執行多個檔案的編輯   
          2.5 執行 sed 輸出控制   
          2.1.執行命令列上的編輯指令   
            當編輯指令(參照[section 2.2])在命令列上執行時 , 其前必須加上選項 -e 。 
          其命令格式如下 :   
           
              sed -e '編輯指令1' -e '編輯指令2' ... 文件檔    
           
          其中 , 所有編輯指令都緊接在選項 -e 之後 , 并置於兩個 " ' " 特殊字元間。 
          另外 , 命令上編輯指令的執行是由  
          左而右。  
           
            一般編輯指令不多時 , 使用者通常直接在命令上執行它們。例如 , 刪除 yel. 
          dat 內 1 至 10 行資料 , 并將其  
            馀文字中的 "yellow" 字串改成 "black" 字串。此時 , 可將編輯指令直接在命 
          令上執行 , 其命令如下 :   
           
              sed -e '1,10d' -e 's/yellow/black/g' yel.dat    
           
          在命令中 , 編輯指令 '1,10d'(解[5])執行刪除 1 至 10 行資料 ; 編輯指令  
          's/yellow/black/g'(解[6]) ,   
          "yellow" 字串替換(substuite)成 "black" 字串。   
          2.2 sed 的編輯指令   
            sed 編輯指令的格式如下 :   
                       [address1[,address2]]function[argument]  
           
          其中 , 位址參數 address1 、address2 為行數或 regular expression 字串 ,  
          表示所執行編輯的資料行 ; 函數參  
          數 function[argument] 為 sed 的內定函數 , 表示執行的編輯動作。   
          下面兩小節 , 將仔細介紹位址參數的表示法與有哪些函數參數供選擇。   
           
          2.2.1 位址(address)參數的表示法  
            實際上 , 位址參數表示法只是將要編輯的資料行 , 用它們的行數或其中的字串 
          來代替表示它們。下面舉幾個例子  
            說明(指令都以函數參數 d(參照[section4.2]) 為例) :   
          刪除檔內第 10 行資料 , 則指令為 10d。   
          刪除含有 "man" 字串的資料行時 , 則指令為 /man/d。   
          刪除檔內第 10 行到第 200 行資料, 則指令為 10,200d。   
           
          刪除檔內第 10 行到含 "man" 字串的資料行 , 則指令為 10,/man/d。   
            接下來 , 以位址參數的內容與其個數兩點 , 完整說明指令中位址參數的表示法 
          (同樣也以函數參數 d 為例)。   
          位址參數的內容:   
          位址為十進位數字 : 此數字表示行數。當指令執行時 , 將對符合此行數的資料執 
          行函數參數指示的編輯動作。例如 ,   
          刪除資料檔中的第 15 行資料 , 則指令為 15d(參照[section4.2])。其馀類推 , 
          如刪除資料檔中的第 m 行資料 , 則  
          指令為 md 。   
           
          位址為 regular expression(參照[附錄 A]):  
          當資料行中有符合 regular expression 所表示的字串時 , 則執行函數參數指示 
          的編輯動作。另外 , 在   
          regular expression 前後必須加上 "/"。例如指令為 /t.*t/d , 表示刪除所有含 
          兩 "t" 字母的資料行。其中 , "."   
          表示任意字元; "*" 表示其前字元可重任意次 , 它們結合 ".*" 表示兩 "t" 字母 
          間的任意字串。   
           
          位址參數的個數 : 在指令中 , 當沒有位址參數時 , 表示全部資料行執行函數參 
          數所指示的編輯動作; 當只有一位址  
          參數時 , 表示只有符合位址的資料行才編輯 ; 當有兩個位址參數 , 如  
          address1,address2 時 , 表示對資料區執行  
          編輯 , address1 代表起始資料行 , address2 代表結束資料行。對於上述內容 , 
           以下面例子做具說明。   
           
          例如指令為   
            
          d   
           
          其表示刪除檔內所有資料行。   
          例如指令為   
            
          5d   
           
          其表示刪除檔內第五行資料。   
          例如指令為   
            
          1,/apple/d  
           
          其表示刪除資料區 , 由檔內第一行至內有 "apple" 字串的資料行。   
          例如指令為   
            
          /apple/,/orange/d   
           
          其表示刪除資料區 , 由檔內含有 "apple" 字串至含有 "orange" 字串的資料行  
            
          2.2.2 有那些函數(function)參數   
            下頁表中介紹所有 sed 的函數參數(參照[chapter 4])的功能。  
          函數參數 功能   
          ∶ label  建立 script file 內指令互相參考的位置。    
          #  建立解    
          { }  集合有相同位址參數的指令。    
          !  不執行函數參數。    
          =  印出資料行數( line number )。    
          a  添加使用者輸入的資料。    
          b label  將執行的指令跳至由 : 建立的參考位置。    
          c  以使用者輸入的資料取代資料。   
           
          d  刪除資料。    
          D  刪除 pattern space 內第一個 newline 字母 前的資料。    
          g  拷貝資料從 hold space。    
          G  添加資料從 hold space 至 pattern space 。    
          h  拷貝資料從 pattern space 至 hold space 。    
          H  添加資料從 pattern space 至 hold space 。    
          l  印出 l 資料中的 nonprinting character 用 ASCII 碼。    
          i  插入添加使用者輸入的資料行。    
          n  讀入下一筆資料。    
          N  添加下一筆資料到 pattern space。    
          p  印出資料。    
          P  印出 pattern space 內第一個 newline 字母 前的資料。    
          q  跳出 sed 編輯。    
          r  讀入它檔內容。    
          s  替換字串。    
          t label  先執行一替換的編輯指令 , 如果替換成牛p>則將編輯指令跳至 : label 
           處執行。    
          w  寫資料到它檔內。    
          x  交換 hold space 與 pattern space 內容。    
          y  轉換(transform)字元。    
          雖然 , sed 只有上表所述幾個擁有基本編輯功能的函數 , 但由指令中位址參數和 
          指令與指令間的配合 , 也能使   
          sed 完成大部份的編輯任務。   
          2.3 執行檔案內的編輯指令   
            當執行的指令太多 , 在命令列上撰寫起來十分混亂 , 此時 , 可將這些指令整 
          理儲存在檔案  
            (譬如檔名為 script_file )內 , 用選項 -f script_file , 則讓 sed 執行  
          script_file 內的編輯指令。其命  
            令的格示如下 :   
               sed -f script_file 文件檔    
           
          其中 , 執行 script_file 內編輯指令的順序是由上而下。例如上一節的例子 ,  
          其可改成如下命令:   
               sed -f ysb.scr yel.dat    
           
          其中 , ysb.scr 檔的內容如下 :   
          1,10d  
          s/yellow/black/g  
           
            另外 , 在命令列上可混合使用選項 -e 與 -f , sed 執行指令順序依然是由命 
          令列的左到右, 如執行至 -f 後  
            檔案內的指令 , 則由上而下執行。   
           
           
          2.4 執行多個文件檔的編輯   
            在 sed 命令列上 , 一次可執行編輯多個文件檔 , 它們跟在編輯指令之後。例 
          如 , 替換  
             white.dat、red.dat、black.dat 檔內的 "yellow" 字串成 "blue" , 其命令 
          如下:   
                sed -e 's/yellow/blue/g' white.dat red.dat black.dat   
           
          上述命令執行時 , sed 依 white.dat、red.dat、black.dat 順序 , 執行編輯指 
          令 s/yellow/blue/(請參照[section 4.1] ,   
          進行字串的替換。  
           
          2.5.執行輸出的控制   
            在命令列上的選項 -n (解[7]) 表示輸出由編輯指令控制。由前章內容得知 ,  
          sed 會 "自動的" 將資料由  
             pattern space 輸送到標準輸出檔。但藉著選項 -n , 可將 sed 這 "自動的 
          " 的動作改成 "被動的" 由它所執行的  
             編輯指令(解[8])來決定結果是否輸出。   
            由上述可知 , 選項 -n 必須與編輯指令一起配合 , 否則無法獲得結果。例如 , 
           印出 white.dat 檔內含有 "white"   
            字串的資料行 , 其命令如下:   
           
                sed -n -e '/white/p' white.dat     
           
          上面命令中 , 選項 -n 與編輯指令 /white/p (參照[section4.6]) 一起配合控制 
          輸出。其中 , 選項 -n 將輸出控制權  
          移給編輯指令;/white/p 將資料行中含有 "white" 字串印出螢幕。    
           

          =====================================================

          1.sed -n '2'p filename 
          打印文件的第二行。

          2.sed -n '1,3'p filename 
          打印文件的1到3行

          3. sed -n '/Neave/'p filename 
          打印匹配Neave的行(模糊匹配)

          4. sed -n '4,/The/'p filename 
          在第4行查詢模式The

          5. sed -n '1,$'p filename 
          打印整個文件,$表示最后一行。

          6. sed -n '/.*ing/'p filename 
          匹配任意字母,并以ing結尾的單詞(點號不能少)

          7 sed -n / -e '/music/'= filename 
          打印匹配行的行號,-e 會打印文件的內容,同時在匹配行的前面標志行號。-n只打印出實際的行號。

          8.sed -n -e '/music/'p -e '/music/'= filename 
          打印匹配的行和行號,行號在內容的下面

          9.sed '/company/' a "Then suddenly it happend" filename 
          選擇含有company的行,將后面的內容"Then suddenly it happend"加入下一行。注意:它并不改變文件,所有

          操作在緩沖區,如果要保存輸出,重定向到一個文件。

          10. sed '/company/' i "Then suddenly it happend" filename 
          同9,只是在匹配的行前插入

          11.sed '/company/' c "Then suddenly it happend" filename 
          用"Then suddenly it happend"替換匹配company的行的內容。

          12.sed '1'd ( '1,3'd '$'d '/Neave/'d) filename 
          刪除第一行(1到3行,最后一行,匹配Neave的行)

          13.[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n] 
          s選項通知s e d這是一個替換操作,并查詢pattern-to-find,成功后用replacement-pattern替換它。 
          替換選項如下: 
          g 缺省情況下只替換第一次出現模式,使用g選項替換全局所有出現模式。 
          p 缺省s e d將所有被替換行寫入標準輸出,加p選項將使- n選項無效。- n選項不打印輸出結果。 
          w 文件名使用此選項將輸出定向到一個文件。(注意只將匹配替換的行寫入文件,而不是整個內容)

          14.sed s'/nurse/"hello "&/' filename 
          將'hello '增加到'nurse' 的前面。

          15. sed '/company/r append.txt' filename 
          在匹配company的行的下一行開始加入文件append.txt的內容。

          16. sed '/company/'q filename 
          首次匹配company后就退出sed程序

          ==============================


          sed 's/abc/123/g' myfile

          sed -n 's/^west/north/p' myfile
          打印替換了west開頭用north替換的行

          sed -n '/aa/,/bb/p' myfile
          打印在包含以aa開頭到以bb結束的行

          sed '1,4s/aa/bb/g' myfile

          sed '4,/aa/s/11/22/g' myfile
          在第4行后到包含aa結束的行中,替換11為22

          sed 'aa/,/bb/s/11/22/g' myfile
          在包含以aa開頭到以bb結束的行中,替換11為22

          sed '1,5s/$/cc/' myfile
          每行的末尾以cc來替換

          --e-----------------------
          sed -e '1,3d' -e 's/aa/bb/' myfile
          對myfile同時執行d 與s 操作

          --w-----------------------
          sed -n '/north/w newfile' myfile
          把myfile中包含north的行寫入newfile中

          --a-----------------------
          sed '/^north /a \
          ----->add string------------------' myfile
          往myfiel追加行

          --i-----------------------
          sed '/aa/i\
          new line1--------------
          ------------new line2--------------' myfile

          在包含/aa的行下插入行

          --n--------------------
          sed /aa/{n;s/11/22/;} myfile
          找到包含aa的行后,對下一行執行s操作

          --y--------------------

          sed 1,3y/abcdefg/ABCDEFG' myfile
          在1,3行中把abcdefg變形為ABCDEFG

          --q---------------------
          sed '5q' myfile
          推出命令。執行到5行后退出

          --h 與 g,x--------------
          sed -e '/aa/h' -e '$g' myfile
          把包含aa的行放如緩沖區,在最后一行中增加(也就是把包含有aa的行追加到最后一行中)


          sed -e '/aa/{h;d; }' -e '/bb/{g;}' myfile
          把包含aa的行放入緩沖區,刪除包含aa的行;找到bb的行后,把aa的行在后面追加

          sed -e '/aa/h' -e '$g' myfile

          sed -e '/aa/h' -e '/bb/x' myfile
          把包含aa的行放入緩沖區,當出現/bb的行時,則把bb的內容換為緩沖區的內容

          為了使用上述輸出信息做進一步自動處理,需要知道所存數據庫名稱,為此需執行以下操作:
            1) 使用s / - * / / g刪除橫線- - - - - -。
            2) 使用/ ^ $ / d刪除空行。
            3) 使用$ d刪除最后一行
            4) 使用1 d刪除第一行。
            5) 使用awk {print $1}打印第一列。
            命令如下,這里使用了c a t,并管道傳送結果到s e d命令  
            最后的命令如下:
             cat sql.txt| sed 's/-*//g'|sed '/^$//g'|sed '$d'|sed '1d'|awk '{print $1}'
             
            去除行首數字:
             sed 's/^[0-9]//g' data.txt
             
          10、一些常用的處理
            ‘s / \ . $ / / g’ 刪除以句點結尾行
            ‘-e /abcd/d’ 刪除包含a b c d的行
            ‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
            ‘s / ^ [ ] [ ] * / / g’ 刪除行首空格
            ‘s / \ . [ ] [ ] * / [ ] / g’ 刪除句點后跟兩個或更多空格,代之以一個空格
            ‘/ ^ $ / d’ 刪除空行
            ‘s / ^ . / / g’ 刪除第一個字符
            ‘s /CO L \ ( . . . \ ) / / g’ 刪除緊跟C O L的后三個字母
            ‘s / ^ \ / / / g’ 從路徑中刪除第一個\
            ‘s / [ ] / [ ] / / g’ 刪除所有空格并用t a b鍵替代
            ‘S / ^ [ ] / / g’ 刪除行首所有t a b鍵
            ‘s / [ ] * / / g’ 刪除所有t a b鍵

          2、關于tr
             通過使用 tr,您可以非常容易地實現 sed 的許多最基本功能。您可以將 tr 看作為 sed 的(極其)簡化的變體:它可以用一個字符來替換另一個字符,或者可以完全除去一些字符。您也可以用它來除去重復字符。這就是所有 tr 所能夠做的。 
                 tr用來從標準輸入中通過替換或刪除操作進行字符轉換。tr主要用于刪除文件中控制字符或進行字符轉換。使用tr時要轉換兩個字符串:字符串1用于查詢,字符串2用于處理各種轉換。tr剛執行時,字符串1中的字符被映射到字符串2中的字符,然后轉換操作開始。
          帶有最常用選項的tr命令格式為:
          tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
          這里:
          -c 用字符串1中字符集的補集替換此字符集,要求字符集為ASCII。
          -d 刪除字符串1中所有輸入字符。
          -s 刪除所有重復出現字符序列,只保留第一個;即將重復出現字符串壓縮為一個字符串。
          input-file是轉換文件名。雖然可以使用其他格式輸入,但這種格式最常用。
          2、字符范圍
          指定字符串1或字符串2的內容時,只能使用單字符或字符串范圍或列表。
          [a-z] a-z內的字符組成的字符串。
          [A-Z] A-Z內的字符組成的字符串。
          [0-9] 數字串。
          \octal 一個三位的八進制數,對應有效的ASCII字符。
          [O*n] 表示字符O重復出現指定次數n。因此[O*2]匹配OO的字符串。
          tr中特定控制字符的不同表達方式
          速記符含義八進制方式
          \a Ctrl-G  鈴聲\007
          \b Ctrl-H  退格符\010
          \f Ctrl-L  走行換頁\014
          \n Ctrl-J  新行\012
          \r Ctrl-M  回車\015
          \t Ctrl-I  tab鍵\011
          \v Ctrl-X  \030
          3、應用例子
          (1)去除oops.txt里面的重復的小寫字符
          tr -s "[a-z]"<oops.txt >result.txt
          (2)刪除空行
          tr -s "[\012]" < plan.txt 或 tr -s ["\n"] < plan.txt
          (3)有時需要刪除文件中的^M,并代之以換行
          tr -s "[\015]" "[\n]" < file 或 tr -s "[\r]" "[\n]" < file
          (4)大寫到小寫
          cat a.txt |tr "[a-z]" "[A-Z]" >b.txt
          (5)刪除指定字符
              一個星期的日程表。任務是從其中刪除所有數字,只保留日期。日期有大寫,也有小寫格式。因此需指定兩個字符范圍[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]" 將文件每行所有不包含在[a-z]或[A-Z](所有希臘字母)的字符串放在字符串1中并轉換為一新行。-s選項表明壓縮所有新行, -c表明保留所有字母不動。原文件如下,后跟tr命令:
          tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt
          (6)轉換控制字符
              tr的第一個功能就是轉換控制字符,特別是從dos向UNIX下載文件時,忘記設置ftp關于回車換行轉換的選項時更是如此。cat -v filename 顯示控制字符。
              cat -v stat.txt
              box aa^^^^^12^M
              apple bbas^^^^23^M
              ^Z
          猜想‘^ ^ ^ ^ ^ ^’是tab鍵。每一行以Ctrl-M結尾,文件結尾Ctrl-Z,以下是改動方法。
          使用-s選項,查看ASCII表。^的八進制代碼是136,^M是015,tab鍵是011,^Z是032 ,下面將按步驟完成最終功能。
          用tab鍵替換^ ^ ^ ^ ^ ^,命令為"\136" "[\011*]"。將結果重定向到臨時工作文件stat.tmp
          tr -s "[\136]" "[\011*]" <stat.txt >stat.tmp
          用新行替換每行末尾的^M,并用\n去除^Z,輸入要來自于臨時工作文件stat.tmp。
          tr -s "[\015][\032]" "\n" <stat.tmp
          要刪除所有的tab鍵,代之以空格,使用命令
          tr -s "[\011]" "[\040*]" <input.file
          (7)替換passwd文件中所有冒號,代之以tab鍵,可以增加可讀性
          tr -s "[:]" "[\011]" < /etc/passwd 或 tr -s "[:]" "[\t]" < /etc/passwd
          (8)使路徑具有可讀性
              如果用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等類似的命令來顯示路徑信息的話,我們看到的將會是一大堆用冒號連接在一起的路徑, tr命令可以把這些冒號轉換為回車,這樣,這些路徑就具有很好的可讀性了
          echo $PATH | tr ":" "\n" 
          (9)可以在vi內使用所有這些命令!只要記?。涸趖r命令前要加上您希望處理的行范圍和感嘆號 (?。?,如 1,$!tr -d '\t'(美元符號表示最后一行)。
          (10)另外,當有人給您發送了一個在 Mac OS 或 DOS/Windows 機器上創建的文本文件時,您會發現tr非常有用。
              如果沒有將文件保存為使用  UNIX 換行符來表示行結束這種格式,則需要將這樣的文件轉換成本機 UNIX 格式,否則一些命令實用程序不會正確地處理這些文件。Mac OS  的行尾以回車字符(\r)結束,許多文本處理工具將這樣的文件作為一行來處理。為了糾正這個問題,可以用下列技巧: 
          Mac -> UNIX:tr "\r" "\n"<macfile > unixfile
          UNIX -> Mac:tr "\n" "\r"<unixfile > macfile
          Microsoft DOS/Windows 約定,文本的每行以回車字符(\r)并后跟換行符(\n)結束。為了糾正這個問題,可以使用下列命令: 
          DOS -> UNIX:tr -d "\r"<dosfile > unixfile
          UNIX -> DOS:在這種情況下,需要用awk,因為tr不能插入兩個字符來替換一個字符。要使用的 awk 命令為 awk '{ print $0"\r" }'<unixfile > dosfile
          注:都可以用sed 來完成。
          3、sort uniq join cut paste split
            ================sort用法=====================
           sort命令將許多不同的域按不同的列順序分類。
          1、sort選項
           sort命令的一般格式為:
            sort -cmu -o output_file [other options] +pos1 +pos2 input_files
            下面簡要介紹一下s o r t的參數:
            -c 測試文件是否已經分類。
            -m 合并兩個分類文件。
            -u 刪除所有復制行。
            -o 存儲s o r t結果的輸出文件名。
            其他選項有:
            -b 使用域進行分類時,忽略第一個空格。
            -n 指定分類是域上的數字分類。
            -t 域分隔符;用非空格或t a b鍵分隔域。
            -r 對分類次序或比較求逆。
            +n n為域號。使用此域號開始分類。
            n n為域號。在分類比較時忽略此域,一般與+ n一起使用。
            post1 傳遞到m,n。m為域號,n為開始分類字符數;例如4,6意即以第5域分類,從第7個字符開始。
          2、sort啟動方式
            缺省情況下, s o r t認為一個空格或一系列空格為分隔符。要加入其他方式分隔,使用- t選項。
            sort執行時,先查看是否為域分隔設置了- t選項,如果設置了,則使用它來將記錄分隔成域0、域1等等;
           如果未設置,用空格代替。缺省時s o r t將整個行排序,指定域號的情況例外。
            關于s o r t的一個重要事實是它參照第一個域作為域0,域1是第二個域,等等。
          3、文件是否已分類
            sort -c data.txt
          4、sort分類求逆
           如果要逆向s o r t結果,使用-r選項。
             sort -t: -r video.txt
          5、按指定域分類
           有時需要只按第2域(分類鍵1)分類。
            sort -t: +1 video.txt
          6、數值域分類
           用-n選項。必須用,不然得不到想要的結果。
            sort -t: +3n video.txt
          7、唯一性分類
           使用- u選項進行唯一性(不重復)分類以去除重復行。
          8、使用k的其他sort方法
           sort還有另外一些方法指定分類鍵。可以指定k選項。
            sort -t: -k4 video.txt
            
           使用k做分類鍵排序:  
           可以指定分類鍵次序。先以第4域,再以第1域分類,命令為-k4 -k1
            sort -t: -k4 -k1 video.txt
          9、指定sort序列
           可以指定分類鍵順序,也可以使用- n選項指定不使用哪個分類鍵進行查詢。看下面的sort命令:
            sort +0 -2 +3
           該命令意即開始以域0分類,忽略域2,然后再使用域3分類。
          10、pos用法
           指定開始分類的域位置的另一種方法是使用如下格式:
            sort  +filed.characterin
           意即從filed開始分類,但是要在此域的第characterin個字符開始。 
          11、使用head和tail將輸出分類
            可以使用h e a d或t a i l查閱任何大的文本文件 
            head -200 filename
          12、awk使用sort輸出結果
          13、將兩個分類文件合并
            將文件合并前,它們必須已被分類.
            使用-m +0。將這個文件并入已存在的分類文件v i d e o . s o r t,要以名稱域進行分類,實際上沒有必要加入+ o,但為了保險起見,還是加上的好。
             sort -t: -m +0 video2.txt video.sort
             
             ===================uniq用法====================
            uniq用來從一個文本文件中去除或禁止重復行。一般u n i q假定文件已分類,并且結果正確。
            sort的唯一性選項去除所有重復行,而uniq命令并不這樣做。重復行是什么?在uniq里意即持續不斷重復出現的行,中間不夾雜任何其他文本.
            命令一般格式:
             uniq -u d c -f inputfile outputfile
            其選項含義:
             -u 只顯示不重復行。
             -d 只顯示有重復數據行,每種重復行只顯示其中一行
             -c 打印每一重復行出現次數。
             -f n為數字,前n個域被忽略。
             一些系統不識別- f選項,這時替代使用- n。
            對特定域進行測試:
            使用- n只測試一行一部分的唯一性。例如- 5意即測試第5域后各域唯一性。域從1開始記數。
           如果忽略第1域,只測試第2域唯一性,使用- n 2,下述文件包含一組數據,其中第2域代表組代碼。
             uniq -f2 parts.txt或
             uniq -n2 parts.txt
            ==================join用法(強大呀,像sql里面的join 呢)========================
           join用來將來自兩個分類文本文件的行連在一起。
           下面講述join工作方式。這里有兩個文件f i l e 1和f i l e 2,當然已經分類。每個文件里都有一
          些元素與另一個文件相關。由于這種關系, join將兩個文件連在一起,這有點像修改一個主文
          件,使之包含兩個文件里的共同元素。
           為有效使用join,需分別將輸入文件分類:
           join的格式: 
            join [option] file1,file2
            an n 為一數字,用于連接時從文件n中顯示不匹配行。例如, -a1顯示第一個文件的不匹
           配行,- a2為從第二個文件中顯示不匹配行。
            o n.m n為文件號,m為域號。1.3表示只顯示文件1第三域,每個n,m必須用逗號分隔,
           如1.3,2.1。
            j n m   n為文件號,m為域號。使用其他域做連接域
            t  域分隔符。用來設置非空格或t a b鍵的域分隔符。例如,指定冒號做域分隔符- t:
            
           連接域為域0,缺省join刪除或去除連接鍵的第二次重復出現:
             join names.txt town.txt
           1、不匹配連接,下面的例子顯示匹配及不匹配域
             join -a1 -a2 names.txt town.txt
            只顯示第一個文件中不匹配行:
             join -a1 names.txt town.txt
           2、選擇性連接
           使用- o選項選擇連接域。例如要創建一個文件僅包含人名及城鎮, j o i n執行時需要指定顯示域。方式如下:
           使用1 . 1顯示第一個文件第一個域,2 . 2顯示第二個文件第二個域,其間用逗號分隔。命令為:
             join -o 1.1,2.2 names.txt town.txt
           使用-jn m進行其他域連接,例如用文件1域3和文件2域2做連接鍵,命令為:
             join -j1 3 -j2 2 names.txt town.txt
           
           ===========================cut用法=========================================
           cut用來從標準輸入或文本文件中剪切列或域。剪切文本可以將之粘貼到一個文本文件。
           cut一般格式為:
           cut [options] file1 file2
           下面介紹其可用選項:
           -c list 指定剪切字符數。
           -f field 指定剪切域數。
           -d 指定與空格和t a b鍵不同的域分隔符。
           -c 用來指定剪切范圍,如下所示:
           -c 1,5-7 剪切第1個字符,然后是第5到第7個字符。
           -c1-50 剪切前5 0個字符。
           -f 格式與- c相同。
           -f 1,5 剪切第1域,第5域。
           - f 1,10-12 剪切第1域,第1 0域到第1 2域。
           
           剪切指定域:
           cut命令中剪切各域需用逗號分隔,如剪切域1和3,可以使用:
            cut -d: -f1,3 pers
           
           =========================paste用法==========================================
            cut用來從文本文件或標準輸出中抽取數據列或者域,然后再用paste可以將這些數據粘貼
           起來形成相關文件。粘貼兩個不同來源的數據時,首先需將其分類,并確保兩個文件行數相同。
            paste將按行將不同文件行信息放在一行。缺省情況下,paste連接時,用空格或t a b鍵分隔
           新行中不同文本,除非指定- d選項,它將成為域分隔符。
            paste格式為;
             paste -d -s -file1 file2
           選項含義如下:
            -d 指定不同于空格或t a b鍵的域分隔符。例如用@分隔域,使用- d @。
            -s 將每個文件合并成行而不是按行粘
            
           paste命令管道輸入:
           paste命令還有一個很有用的選項( -)。意即對每一個( -),從標準輸入中讀一次數據。
           使用空格作域分隔符,以一個4列格式顯示目錄列表。方法如下:
             ls |paste -d":" - - - -
           =========================split用法==========================================
            split用來將大文件分割成小文件。
            
           split -output_file-size input-filename output-filename
           每個文件格式為x [ a a ]到x [ z z ],x為文件名首字母, [ a a ]、[ z z ]為文件名剩余部分順序字符組合.
             split -5000 url_access_user.txt splitfile
           
           
          UNIX下用awk對話單統計日消費額
           
          =============================================================
          1、用awk實現按照電話號碼進行統計
          =============================================================
          一般情況下,電話公司從交換機采集后將生成定長的話單文件,文件名也有一定的格式,如筆者正要處理的話單格式如下:
          [zengzc@ZCBILL bill_data]$ cat Ticket_20041210_11
          87881141,10,10,120,  0,20041210092920
          87881142,10,30,230,-10,20041210092920
          87881143,10,30,100,-20,20041210092920
          87881143,10,30,110, 10,20041210093825
          87881143,10,40, 90,  0,20041210095005
          87881146,10,15, 45,  0,20041210092525
          87881130,10,15, 80,  0,20041210092525
          87881131,10,45, 60,  0,20041210090306
          87881132,10,45,300, 20,20041210100101
          87881133,10,60, 45, 20,20041210100101
          87881134,10,10, 55,-10,20041210101010
          87881134,10,20, 55,-10,20041210102020
          87881143,10,20, 60,  0,20041210110201
          87881143,10,10, 20,  0,20041210111515
          第1~8為電話號碼
          第10~11為基本費
          第13~14為長途費
          第16~18為附加費
          第20~22為優惠費
          第24~27為YYYYMMDDHH24MISS格式的日期。
          如果我想要把每一個客戶的基本費+長途費+附加費+優惠費進行匯總,然后得出日消費總額。當然如果采用Oracle是非常容易的,先把數據用SQL LOADER導入到Oracle數據庫中,然后將幾個費用的字段按照電話號碼進行sum就OK了。當然我要講的是采用AIX下的awk或者gawk(Linux下,GNU)進行統計,然后導入到Oracle數據庫中。我試驗過,一般情況下某一個本地網每日的話單都在千萬級或者億級的記錄數,在處理速度上采用awk是有優勢的。以下就簡單的進行介紹。
          1)、先寫出如下的awk程序:
          [zengzc@ZCBILL bill_data]$ cat StatFee.sh
          #!/bin/gawk -f
          BEGIN \
          {
          FS=","
          }
          {
          PhoneList[$1]=$1
          AllFeesPerPhone=$2+$3+$4+$5
          Fee[$1]+=AllFeesPerPhone
          };
          END \
          {
          for (Row in PhoneList)
          {
           print "Phone Number : "PhoneList[Row]"  All Fees :"Fee[Row]
          }
          }
          2)、chmod +x StatFee.sh
          3)、執行:./StatFee.sh Ticket_20041210_11
          4)、搞定,得出如下數據:
          Phone Number : 87881130  All Fees :105
          Phone Number : 87881131  All Fees :115
          Phone Number : 87881132  All Fees :375
          Phone Number : 87881141  All Fees :140
          Phone Number : 87881133  All Fees :135
          Phone Number : 87881142  All Fees :260
          Phone Number : 87881134  All Fees :140
          Phone Number : 87881143  All Fees :550
          Phone Number : 87881146  All Fees :70
           
          =============================================================
          2、用awk實現按照時段進行統計
                炮制電話號碼的統計方法。
          =============================================================
          1)有如下數據(和第一部分是一樣的,只是我用awk先把數據進行切分,具體切分方法見后面的附):
          [zengzc@ZCBILL bill_data]$ cat Ticket_20041210_11_1
          87881141,10,10,120,  0,20041210,09,2920
          87881142,10,30,230,-10,20041210,09,2920
          87881143,10,30,100,-20,20041210,09,2920
          87881143,10,30,110, 10,20041210,09,3825
          87881143,10,40, 90,  0,20041210,09,5005
          87881146,10,15, 45,  0,20041210,09,2525
          87881130,10,15, 80,  0,20041210,09,2525
          87881131,10,45, 60,  0,20041210,09,0306
          87881132,10,45,300, 20,20041210,10,0101
          87881133,10,60, 45, 20,20041210,10,0101
          87881134,10,10, 55,-10,20041210,10,1010
          87881134,10,20, 55,-10,20041210,10,2020
          87881143,10,20, 60,  0,20041210,11,0201
          87881143,10,10, 20,  0,20041210,11,1515
          2)編寫awk腳本,并且存儲為:StatFee_Time.sh
          [zengzc@ZCBILL bill_data]$ cat StatFee_Time.sh
          #!/bin/awk -f 
          BEGIN \
          {
           FS=","
          }
          {
           TimeList[$7]=$7
           AllFeesPerPhone=$2+$3+$4+$5
           Fee[$7]+=AllFeesPerPhone
          };
          END \
          {
           for (Row in TimeList)
            print "Time Section : "TimeList[Row]"  All Fees :"Fee[Row]
          }
          3)、使得腳本StatFee_Time.sh可執行
          chmod +x StatFee_Time.sh
          4)執行 ./StatFee_Time.sh Ticket_20041210_11_1,OK,得到結果:
          [zengzc@ZCBILL bill_data]$ ./StatFee_Time.sh Ticket_20041210_11_1
          Time Section : 09  All Fees :1110
          Time Section : 10  All Fees :650
          Time Section : 11  All Fees :130
          附:切分話單中的日期的腳本:
          awk -F, '{print $1","$2","$3","$4","$5","substr($6,1,8)","substr($6,9,2)","substr($6,11,4)}' Ticket_20041210_11 >Ticket_20041210_11_1
          posted on 2013-01-08 12:37 abin 閱讀(1679) 評論(0)  編輯  收藏 所屬分類: linux
          主站蜘蛛池模板: 堆龙德庆县| 昌宁县| 邵武市| 平顺县| 滨州市| 本溪市| 南木林县| 涪陵区| 左云县| 福泉市| 垣曲县| 临沂市| 屏山县| 理塘县| 页游| 梅河口市| 宜良县| 九龙坡区| 富民县| 榕江县| 革吉县| 措勤县| 邻水| 沁阳市| 九江县| 杭锦后旗| 玉屏| 兴仁县| 罗田县| 灵石县| 新晃| 肥东县| 东乌珠穆沁旗| 尤溪县| 曲靖市| 盐城市| 怀化市| 岗巴县| 塘沽区| 太仓市| 连江县|