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