设为首页 收藏本站
查看: 919|回复: 0

第五章 shell学习之文件的排序、合并和分割

[复制链接]

尚未签到

发表于 2018-8-30 06:16:56 | 显示全部楼层 |阅读模式
  sort命令
  sort [选项] [输入文件]
  选项:
  -c 测试文件是否已经排序,如果未被排序则输出第一个未被排序的记录
  -k 指定排序的域
  -m 合并两个已排序的文件,合并的文件也已经排序,如sort -m a1 a2,a1的记录被有序的插入a2
  -n 根据数字的大小进行排序,一般放在域号后,如-k3n
  -o 将输出重定向到指定文件
  -r 将排序结果逆向显示
  -t 改变域分割符,如-t:
  -u 去除结果中的重复行
  sort和awk联合
  例:
  [root@localhost tmp]# cat test1.txt
  B liu
  dfad
  dfw,sfa
  A clc
  wers
  sdfa,werw
  F kkk
  ckaf
  fdwae,fwefs
  E ccc
  werw
  sfdf,cdfae
  [root@localhost tmp]# cat test1.txt | awk -v RS="\n\n" '{gsub("\n","@");print $0}' | sort | awk 'BEGIN {ORS="\n\n"} {gsub("@","\n");print $0}'
  A clc
  wers
  sdfa,werw
  B liu
  dfad
  dfw,sfa
  E ccc
  werw
  sfdf,cdfae
  F kkk
  ckaf
  fdwae,fwefs
  uniq命令
  去除文本中连续重复的行,不连续重复的行不能去除(这是和sort -u的区别)
  选项:
  -c 打印每行在文本总重复出现的次数
  -d 只显示重复的记录,每个重复的记录只显示一次
  -u 只显示没有重复的记录
  例:统计字数
  [root@localhost tmp]# cat test2.txt
  thank you all the same,but no thank you,you are same with him.
  did you right.
  [root@localhost tmp]# cat a4.sh
  #! /bin/sh
  argc=1
  e_badarg=55
  e_nofile=56
  if [ $# -ne $argc ]   #参数个数错误
  then
  echo "arg error"
  exit $e_badarg
  fi
  if [ ! -f $1 ]   #文件未找到
  then
  echo "file no found"
  exit $e_nofile
  fi
  sed -e 's/\./ /g' -e 's/\,/ /g' -e 's/ /\n/g' "$1" | sed '/^$/d' | sort | uniq -c | sort -rn
  exit 0
  [root@localhost tmp]# ./a4.sh test2.txt
  4 you
  2 thank
  2 same
  1 with
  1 the
  1 right
  1 no
  1 him
  1 did
  1 but
  1 are
  1 all
  join命令
  实现两个文件记录的连接操作,即将两个文件中具有相同域的记录选出来,把这两个记录的所有域放到同一行
  注意join只能对按照两个按照相同域排序的文件进行连接
  选项:
  -a1或-a2 除了显示共同域,-a1或-a2分别显示第一或第二个文件中没有的共同域的记录
  -i 比较域的内容时忽略大小写
  -o 设置结果显示的格式
  -t 改变域分隔符
  -v1或-v2 分别显示第一或第二个文件中没有的共同域的记录,但不显示共同域连接结果
  -1和-2 分别设置文件1和文件2用于连接的域
  例:
  1.
  [root@localhost tmp]# cat test3.txt
  clc1:111:A
  clc2:222:B
  clc4:444:D
  clc5:555:E
  [root@localhost tmp]# cat test4.txt
  clc1:aaa:A
  clc2:bbb:B
  clc3:ccc:C
  clc5:eee:E
  [root@localhost tmp]# join -t: test3.txt test4.txt
  clc1:111:A:aaa:A
  clc2:222:B:bbb:B
  clc5:555:E:eee:E
  默认只显示两个文件有共同域的连接结果
  2.
  [root@localhost tmp]# join -t: -a1 test3.txt test4.txt
  clc1:111:A:aaa:A
  clc2:222:B:bbb:B
  clc4:444:D
  clc5:555:E:eee:E
  [root@localhost tmp]# join -t: -v1 test3.txt test4.txt
  clc4:444:D
  clc4:222:D为test3.txt特有
  3.
  [root@localhost tmp]# join -t: -1 3 -2 3 test3.txt test4.txt
  A:clc1:111:clc1:aaa
  B:clc2:222:clc2:bbb
  E:clc5:555:clc5:eee
  以第一个文件的第3个域和第二个文件的第3个域作为连接的域,默认都为第一个域,注意连接的域放在了第一位
  4.
  [root@localhost tmp]# join -t: -1 3 -2 3 -o 1.1 1.3 2.2 1.2 test3.txt test4.txt
  clc1:A:aaa:111
  clc2:B:bbb:222
  clc5:E:eee:555
  调整显示的位置,1.1为先显示文件1的第一个域
  cut命令
  从标准输入或文本文件中按字符或者域提取文本
  选项:
  -c 按字符提取
  -f 按域提取
  -d 定义域分隔符,相当于sort和join的-t
  例:
  [root@localhost tmp]# cat test3.txt
  clc1:111:A
  clc2:222:B
  clc4:444:D
  clc5:555:E
  [root@localhost tmp]# cut -c1,4 test3.txt
  c1
  c2
  c4
  c5
  [root@localhost tmp]# cut -d: -f2-3 test3.txt
  111:A
  222:B
  444:D
  555:E
  paste命令
  将文本文件或者标准输出的数据粘贴到一起
  paste [选项] 文件1 文件2
  选项:
  -d 设置输出的域分隔符,默认为tab
  -s 将每个文件粘贴成一行
  格式:文件1的记录1分隔符文件1的记录2...  换行 文件2的记录1分隔符文件2的记录2...
  而默认格式:文件1的记录1分隔符文件2的记录1 换行 文件1的记录2分隔符文件2的记录2
  - 从标准输入中读取数据
  例:
  [root@localhost tmp]# cat test3.txt
  clc1:111:A
  clc2:222:B
  clc4:444:D
  clc5:555:E
  clc6:666:F
  [root@localhost tmp]# cat test4.txt
  clc1:aaa:A
  clc2:bbb:B
  clc3:ccc:C
  clc5:eee:E
  [root@localhost tmp]# paste test3.txt test4.txt
  clc1:111:A      clc1:aaa:A
  clc2:222:B      clc2:bbb:B
  clc4:444:D      clc3:ccc:C
  clc5:555:E      clc5:eee:E
  clc6:666:F
  [root@localhost tmp]# paste -s test3.txt test4.txt
  clc1:111:A      clc2:222:B      clc4:444:D      clc5:555:E      clc6:666:F
  clc1:aaa:A      clc2:bbb:B      clc3:ccc:C      clc5:eee:E
  [root@localhost tmp]# paste -d@ test3.txt test4.txt
  clc1:111:A@clc1:aaa:A
  clc2:222:B@clc2:bbb:B
  clc4:444:D@clc3:ccc:C
  clc5:555:E@clc5:eee:E
  clc6:666:F@
  [root@localhost tmp]# paste -s -d@ test3.txt test4.txt
  clc1:111:A@clc2:222:B@clc4:444:D@clc5:555:E@clc6:666:F
  clc1:aaa:A@clc2:bbb:B@clc3:ccc:C@clc5:eee:E
  [root@localhost tmp]# ls | paste -d: - - - -      #以:为分隔符每行显示4个文件
  1c:a:a1:a1~
  a1.awk:a2.awk:a3.awk:a4.awk
  a4.sh:aa:aabc:aac
  a.awk:a.sh:b:b1
  split命令
  把大文件切割存放在多个小文件中
  split [选项] 待切割的大文件 输出的小文件
  选项:
  -或-l 两个等价,指定大文件几行被切一次
  -b 指定大文件多少字节被切一次
  -C 与-b类似,但是尽量维持每行的完整性
  例:
  1.按行分割文件
  [root@localhost tmp]# cat test3.txt
  clc1:111:A
  clc2:222:B
  clc4:444:D
  clc5:555:E
  clc6:666:F
  [root@localhost tmp]# split -2 test3.txt clc.txt
  [root@localhost tmp]# ls clc*
  clc.txtaa  clc.txtab  clc.txtac
  [root@localhost tmp]# cat clc.txtaa
  clc1:111:A
  clc2:222:B
  [root@localhost tmp]# cat clc.txtab
  clc4:444:D
  clc5:555:E
  [root@localhost tmp]# cat clc.txtac
  clc6:666:F
  2.按字节分割文件
  [root@localhost tmp]# ll test3.txt
  -rw-r--r-- 1 root root 55 Dec 15 18:20 test3.txt
  [root@localhost tmp]# split -b 20 test3.txt clc.db
  [root@localhost tmp]# ll clc.db*
  -rw-r--r-- 1 root root 20 Dec 15 18:44 clc.dbaa
  -rw-r--r-- 1 root root 20 Dec 15 18:44 clc.dbab
  -rw-r--r-- 1 root root 15 Dec 15 18:44 clc.dbac
  [root@localhost tmp]# cat clc.dbaa
  clc1:111:A
  clc2:222:[root@localhost tmp]# cat clc.dbab
  B
  clc4:444:D
  clc5:55[root@localhost tmp]# cat clc.dbac
  5:E
  clc6:666:F
  3.按字节分割文件但是尽量保留行的完整性
  [root@localhost tmp]# split -C 20 test3.txt clc.db
  [root@localhost tmp]# ll clc.db*
  -rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbaa
  -rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbab
  -rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbac
  -rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbad
  -rw-r--r-- 1 root root 11 Dec 15 18:46 clc.dbae
  [root@localhost tmp]# cat clc.dbaa
  clc1:111:A
  ...
  tr命令
  实现字符转换功能,可用sed代替
  只能标准输入,即要么将文件重定向到标准输入,要么用管道
  tr [选项] 字符串1 字符串2

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558557-1-1.html 上篇帖子: 第四章 shell学习之sed命令和awk编程 下篇帖子: 第六章 shell学习之变量和引用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表