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内使用所有这些命令!只要记住:在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 来完成。
================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