shell脚本(三)

2、文件排序、合并和分割

(1)sort命令

#-c:测试文件是否已经排序;-k:指定排序域;-m:合并两个已经排序的文件;

#-n:根据数字大小进行排序;-o:将输出写到文件;-r:将排序结果逆向显示

#-t:改变域分隔符;-u:去除结果中的重复行

#将a.txt逆向排序,并去除重复的行

sort -u -r a.txt

#以":"为分隔符,根据第3域数字大小来对/etc/passwd排序

sort -t: -k3n /etc/passwd

#合并已经排序的两个文件,需要合并的两个文件一定是已经排序了的

sort -u -m a.txt b.txt

#根据第2域来排序

sort -k2 a.txt


(2)uniq命令


#去除文本中重复的行,-c:打印第行在文本中重复出现次数;-d:只显示有重复的记录,

#每个重复记录只出现一次;-u:只显示没有重复的记录

#需要特别注意的是所说的"重复"是指连续出现的重复!如文件test.txt内容:

1

1

2

1

uniq -c test.txt

#结果为,第1行数字1出现次数为2,第2行数字2出现次数为1,第4第数字1出现次数为1

2 1

1 2

1 1

#再如

#如果需要统计文件中所有重复的行,则需要先对它进行排序

sort 10.txt | uniq -c 10.txt

#注意与uniq -c 10.txt的区别

#只显示重复的行,注意两者区别

uniq -d 10.txt

sort 10.txt | uniq -d 10.txt

#只显示没有重复的行,注意文件排序前后去除重复行结果对比

#因为第1行开始数字1连续出现3次,所以uniq -u 10.txt 不会在第1行显示1


(3)join命令

#实现两个文件记录的连接,需要注意的是连接的文件要先进行排序,否则报错!

#必需对连接域进行排序再连接,否则报错!

#-i:比较域内容时,忽略大小写差异;-o:设置结果显示的格式;-t:改变域分隔符;

#-1和-2:-1设置文件1用于连接的域,-2设置文件2用于连接的域

#-a1或-a2:除了显示共同域进行连接的结果外,-a1表示还显示文件1中没有共同

#域的记录;-a2表示显示文件2中没有共同域的记录

#连接两个文件相同的域,域以":"为分隔符,注意"B lily"和"B Lily"是不同的!

join -t: a.txt b.txt

#添加-i忽略大小写连接效果

join -t: -i a.txt b.txt

#显示文件1第1域、文件2第3域和文件1第2域

#-v1:不显示文件1以共同域进行连接的结果

#-v2:不显示文件2以共同域进行连接的结果

#-1:文件1需要连接的域;-2:文件2需要连接的域。指定域必需要先进行排序

#默认比较文件1和文件2的第1域。

#以文件1的第1域和文件2的第3域连接

join -t: -1 1 -2 3 name.txt num.txt

(4)cut命令

#cut从标准输入或文本文件中按域或行提取文本

#-c:指定提取的字符数或字符范围;-f:指定提取的域数或域范围;-d:指定域分隔符

#cut从标准输入或文本文件中按域或行提取文本

#-c:指定提取的字符数或字符范围;-f:指定提取的域数或域范围;-d:指定域分隔符

#-cm-n:表示第m到第n个字符;-cm,n:表示第m和第n个字符;

#-cn:表示n个字符;-cn-:表示从第n个字符到最后一个字符。

#-fm-n:表示第m到第n个域;-fm,n:表示第m域和第n域;-fn:表示第n域;

#-fn-:表示从第n域到最后一个域。与-c类似。

#提取第5个字符

cut -c5 name.txt

#提取第4到第6个字符

cut -c4-6 name.txt

#提取第2到最后字符

cut -c2- name.txt

#提取第2和第6个字符

cut -c2,6 name.txt

#以":"为分隔符,提取第1域

cut -d: -f1 num.txt

#以":"为分隔符,提取第1域到第3域

cut -d: -f1-3 num.txt

#以":"为分隔符,提取第2域到最后1域

cut -d: -f2- num.txt

#以":"为分隔符,提取第1域和第4域

cut -d: -f1,4 num.txt

#提取第3域的第5个字符

cut -d: -f3 num.txt | cut -c5

(5)paste命令

#将文本或标准输出中的内容粘贴到新的文件,可将来自不同文件的数据粘贴到一起

#-d:指定分隔符,默认为空格或tab;-s:将每个文件粘贴成1行;-:从标准输出读取数据

#合并name.txt和num.txt,并以"-"作为分隔符

paste -d- name.txt num.txt

#以"-"为分隔符,一个文件1行来将name.txt和num.txt合并

#即每一个文件行与行之间以"-"作为连接,将所有行连接成1行

#后面的文件以同样方式连接,然后追加到上一个文件最后面,最终一个文件1行

paste -d- -s name.txt num.txt

#合并name.txt和num.txt,并以默认分隔符作为分隔符

paste -s name.txt num.txt

(6)split命令

#split 选项 file star_name,切割的文件名以start_name开头,默认以x开头

#将大文件切割成小文件,可以按照文件的行数、字节数切割文件,并能在输出的小

#小文件中自动加上编号

#-数字n或-l数字n:以n行作为一个文件;-b:指定多少个字节作为一个文件;

#-C:与-b类似,但是是切割时尽量维护每行的完整性


#以2行作为1个文件,切割文件名以startname开头

split -2 name.txt startname