Linux文本处理入门深入解析动手实操

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个字符开始。
 
例子:
基本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
 
使用head和tail将输出分类
显示最大的一行
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字符。
[On] 表示字符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" "["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 "[04]" "" < hdisk.txt

上一篇:终于承认!马斯克证实特斯拉在造AI芯片,而且是世上最好的AI硬件


下一篇:神经拟态芯片拉近AI与人脑距离