linux的文本处理(学习笔记)

11合并与分割

s o r t命令的一般格式为:

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个字符开始。

 

例子:

基本sort

sort video.txt>results.out

sort分类求逆

sort -t: -r video.txt

按指定域分类

sort -t: +1 video.txt

数值域分类

sort -t: +3n video.txt

输出结果为:

Alien:HK:119:1982

Boys in Company C:HK:192:2192

The Hill:KL:63:2972

Toy Story:HK:239:3972

Star Wars:HK:301:4102

Aliens:HK:532:4892

A Few Good Men:KL:445:5851

 

s o r t还有另外一些方法指定分类键。可以指定k选项

sort -t: -r -k4 -k1 video.txt

注意:k选项是从1开始计数

 

开始以域0分类,忽略域2,然后再使用域3分类。

sort -t: +0 -2 +3 video.txt

 

pos用法

+ 1 . 2,意即以第1域最左边第3个字符开始分类,

sort -t: -r +1.2 video2.txt

 

使用headtail将输出分类

显示最大的一行

sort -t: -r -k4 video.txt | head -1

显示倒数两行

sort -t: -r -k4 video.txt | tail -2

如果使用h e a d或t a i l时想省略显示行数,缺省时显示1 0行

 

sort -t: -r -k4 video.txt | tail -1 |awk -F: '{print "Worst rental",$1,"has been rented "$3""}'

 

 

系统sort

cat /etc/passwd | sort -t: +0 |awk -F":" '{print $1}'

 

uniq用法

u n i q用来从一个文本文件中去除或禁止重复行

命令一般格式:

uniq -u d c -f input-file output-file

-u 只显示不重复行。

-d 只显示有重复数据行,每种重复行只显示其中一行

-c 打印每一重复行出现次数。

-f n为数字,前n个域被忽略。一些系统不识别- f选项,这时替代使用- n

例子:

# cat myfile.txt

May Day

May Day

May Day

Going Down

May Day

# uniq myfile.txt

May Day

Going Down

May Day

# uniq -c myfile.txt

      3 May Day

      1 Going Down

      1 May Day

使用- d显示重复出现的不唯一行

# uniq -d myfile.txt

May Day

对特定域进行测试

使用- n只测试一行一部分的唯一性。

# cat parts.txt

AK123 OP

DK122 OP

EK999 OP

# uniq -f1 parts.txt

AK123 OP

# uniq -f0 parts.txt

AK123 OP

DK122 OP

EK999 OP

Join用法

- a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。

n.m    n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 . 1。

 

# cat name.txt

M.Golls 12 Hidd Rd

P.Heller The Acre

P.Willey 132 The Grove

T.Norms 84 Connaught Rd

K.Fletch 12 Woodlea

 

# cat town.txt

M.Golls Norwich NRD

P.Willey Galashiels GDD

T.Norms Brandon BSL

K.Fletch Mildenhall MAF

 

普通的JOIN

# join name.txt town.txt

M.Golls 12 Hidd Rd Norwich NRD

P.Willey 132 The Grove Galashiels GDD

T.Norms 84 Connaught Rd Brandon BSL

K.Fletch 12 Woodlea Mildenhall MAF

 

显示不匹配的行

# join -a1 -a2 name.txt town.txt

M.Golls 12 Hidd Rd Norwich NRD

P.Heller The Acre

P.Willey 132 The Grove Galashiels GDD

T.Norms 84 Connaught Rd Brandon BSL

K.Fletch 12 Woodlea Mildenhall MAF

 

以下显示相同结果

# join -a1 name.txt town.txt

M.Golls 12 Hidd Rd Norwich NRD

P.Heller The Acre

P.Willey 132 The Grove Galashiels GDD

T.Norms 84 Connaught Rd Brandon BSL

K.Fletch 12 Woodlea Mildenhall MAF

 

选择性连接

使用- o选项选择连接域

使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:

# join -o 1.1,2.2 name.txt town.txt

M.Golls Norwich

P.Willey Galashiels

T.Norms Brandon

K.Fletch Mildenhall

 

 

使用-jn m进行其他域连接

例如用文件1域3和文件域2做连接键,命令为

# cat pers

P.Jones Office Runner ID897

S.Round UNIX admin ID666

L.Clip Personl Chief ID982

 

# cat pers2

Dept2C ID897 6 years

Dept3S ID666 2 years

Dept5Z ID982 1 years

 

# join -j1 4 -j2 2 pers pers2   无法显示,有疑问

应该是 join -1 4 -2 2 pers pers2

 

# join -1 4 -2 4 -o 1.1,1.2,1.3,2.1,2.2,2.3,2.4 jtxt1 jtxt2

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_QUEST_SMALL1_DATA_01.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_audits01.dbf

Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/data1/LNWASP1_data01_01.dbf

Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/data1/LNWASP1_index01_01.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_tools_01.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_users_01.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/index1/LNWASP1_sysaux02.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/index1/LNWASP1_sysaux03.dbf

Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo1/LNWASP1_ctl_01.dbf

Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo2/LNWASP1_ctl_02.dbf

Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo3/LNWASP1_ctl_03.dbf

Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/rollback/LNWASP1_undotbs01.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/system/LNWASP1_sysaux01.dbf

Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/system/LNWASP1_system01.dbf

Feb 22 05:06 Feb 22 05:06 /data/oracle/LNWASP1/temp/LNWASP1_temp01.dbf

(/apps/oracle/scripts/ADHOC/DOBCPFILETSCHECK/tmp)   (/apps/oracle/scripts/ADHOC/DOBCPFILETSCHECK/tmp)  

 

c u t用法

用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。

c u t一般格式为:

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 -d: -f1,6 /etc/passwd

 

# ls -l|cut -c3-6

 

# who -u | cut -c1-8

 

p a s t e用法

格式为;

paste -d -s -file1 file2

选项含义如下:

-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。

-s 将每个文件合并成行而不是按行粘贴。

- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。

 

# paste pers pers2

P.Jones Office Runner ID897     Dept2C ID897 6 years

S.Round UNIX admin ID666        Dept3S ID666 2 years

L.Clip Personl Chief ID982      Dept5Z ID982 1 years

 

# ls -l|paste –s 按照一行粘贴

# paste -s pers pers2

P.Jones Office Runner ID897     S.Round UNIX admin ID666        L.Clip Personl Chief ID982

Dept2C ID897 6 years    Dept3S ID666 2 years    Dept5Z ID982 1 years

 

 

p a s t e命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。

ls | paste -d" " - - - -

 

 

p l i t用法

命令一般格式:

split -output_file-size input-filename output-filename

这里o u t p u t - f i l e - s i z e指的是文本文件被分割的行数。s p l i t查看文件时,o u t p u t - f i l e - s i z e选项

指定将文件按每个最多1 0 0 0行分割。

 

tr 用法

t r用来从标准输入中通过替换或删除操作进行字符转换。t r主要用于删除文件中控制字符或进行字符转换。使用t r时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。

带有最常用选项的t r命令格式为:

t r - c - d - s [ " s t r i n g 1 _ t o _ t r a n s l a t e _ f r o m " ] [ " s t r i n g 2 _ t o _ t rannsulta_t e _ t o " ] input-f i l e

这里:

-c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。

-d 删除字符串1中所有输入字符。

-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

I n p u t - f i l e是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

 

使用t r时,可以指定字符串列表或范围作为形成字符串的模式。这看起来很像正则表达式,但实际上不是。指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。

[a-z] a-z内的字符组成的字符串。

[A-Z] A-Z内的字符组成的字符串。

[0-9] 数字串。

/octal 一个三位的八进制数,对应有效的A S C I I字符。

[O*n] 表示字符O重复出现指定次数n。因此[ O * 2 ]匹配O O的字符串。

 

# cat oops.txt

And the cowwwwwwwwwwwwws went homeeeeeeeeeeeee

Or did theyyyyyyyy

 

# tr -s "[a-z]"<oops.txt

And the cows went home

Or did they

如果是替换单字符,不需要引号

# tr -s w<oops.txt

And the cows went homeeeeeeeeeeeee

Or did theyyyyyyyy

 

# cat oops.txt | tr -s "[a-z]"

And the cows went home

Or did they

 

删除空行

以下格式都可以:

tr -s "["012]" < plane.txt

tr -s "["n]" < plane.txt

tr -s ['"n'] < plane.txt

tr -s '["n]' < plane.txt

 

转换大小写

tr "[a-z]" "[A-Z]" <quote.txt    小写全部变大写

tr "[a-z]" "[A-Z]" <quote.txt|tee quote4.txt quote5.txt

cat quote.txt |tr "[:lower:]" "[:upper:]"

 

删除指定字符

# cat jtxt1|tr -cs "[a-z][A-Z]" "["012*]"

去除通过ftp上传的文件的控制符号

用t a b键替换^ ^ ^ ^ ^ ^,命令为" " 1 3 6 " " [ " 0 11 * ] "。将结果重定向到临时工作文件s t a t . t m p。

# tr -s "["136]" "["011*]" <stat.tr > stat.tmp

用新行替换每行末尾的^ M,并用" n去除^ Z,输入要来自于临时工作文件s t a t . t m p

# tr -s "["015"032]" ""n" < stat.tmp

 

 

替换p a s s w d文件中所有冒号,代之以t a b键

# tr -s "[:]" "["011]" </etc/passwd

 

匹配多于一个字符

用星号代替所有的0。模式为[ 0 * 4 ],意即匹配至少4个0,替换字符串为星号

tr "[0*4]" "*" < hdisk.txt

 

李世侠,网名caibird2005 , initdba , 战神

MySQL DBA经验6年;

Oracle DBA经验10年;

精通MySQL HA架构,复制,备份,恢复,SQL优化;

熟悉SHELL编程、Python编程、SQL&PL/SQL编程;

MySQL OCP课程讲师;

ORACLE官方认证OCM证书;

BLOG: http://www.cnblogs.com/caibird2005 

          http://www.initdba.cn 

Wechat: caibird2005 

TEL :+86-186-5881-5300 +86-180-7290-8651 

原文地址:https://www.cnblogs.com/caibird2005/p/1459524.html