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鍵
通過使用 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
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 來完成。
================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
[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
炮制電話號碼的統計方法。
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
#!/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]
}
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