<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      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內使用所有這些命令!只要記住:在tr命令前要加上您希望處理的行范圍和感嘆號 (!),如 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 閱讀(1680) 評論(0)  編輯  收藏 所屬分類: linux
    主站蜘蛛池模板: 一级毛片aa高清免费观看| 亚洲国产精品嫩草影院在线观看 | 国产一二三四区乱码免费| 亚洲精品国产国语| 久久精品蜜芽亚洲国产AV| 久久99亚洲综合精品首页| 国产jizzjizz视频免费看 | 亚洲精品福利你懂| 91嫩草私人成人亚洲影院| 亚洲一区精品无码| 中文字幕中韩乱码亚洲大片| 成人永久免费高清| 成人免费无码大片A毛片抽搐 | 亚洲伦理中文字幕| 青青草原精品国产亚洲av| 亚洲国产成人片在线观看| 久久久久亚洲AV成人网人人网站 | 欧洲美女大片免费播放器视频| 亚洲国产成人精品无码区花野真一| 亚洲性无码av在线| 亚洲国产美女在线观看| 中文字幕亚洲综合久久2| 亚洲国产精品热久久| 色拍自拍亚洲综合图区| 亚洲欧洲免费视频| 亚洲色av性色在线观无码| 亚洲av网址在线观看| 亚洲自偷自偷精品| 亚洲春色在线观看| 亚洲一区二区三区深夜天堂| 亚洲视频在线免费看| 亚洲综合无码一区二区三区| 亚洲精品在线电影| 亚洲人成在线精品| 亚洲精品无码成人片久久不卡| 亚洲熟妇无码一区二区三区| 亚洲成a∨人片在无码2023 | 久久精品a一国产成人免费网站| 精品久久久久国产免费| 大陆一级毛片免费视频观看| 国产老女人精品免费视频|