Linux 实用工具-文件合并、去重、分割

在实际作业中,我们经常会碰到长文件的编辑,这个时候要想一行行去找重复之类的操作是非常繁琐的,其实 Linux 自带了相关工具。

  一、两个文件合并
  一个文件在上,一个文件在下

# cat file1 file2 > file3

  一个文件在左,一个文件在右

# paste file1 file2 > file3



  二、一个文件去掉重复的行

# sort file |uniq

  注意:重复的多行记为一行,也就是说这些重复的行还在,只是全部省略为一行!

# sort file |uniq -u

  上面的命令可以把重复的行全部去掉,也就是文件中的非重复行!


  三、两个文件的交集,并集
  前提条件:每个文件中不得有重复行

# cat file1 file2 | sort | uniq > file3      //取出两个文件的并集(重复的行只保留一份)
# cat file1 file2 | sort | uniq -d > file3   //取出两个文件的交集(只留下同时存在于两个文件中的文件)
# cat file1 file2 | sort | uniq -u > file3   //删除交集,留下其他的行



  四、将一个大的文件分割成多个小文件
  采用一个 50M 大小的日志文件进行测试,日志文件名:log.txt,文件行数:208363。
  方法一、split 分割
  语法:split -<行数>-C <字节>要切割的文件

# wc -l log.txt                     //计算总行数;
208363 log.txt
# split -l 120000 log.txt newlog    //通过指定行数,将日志分割成两个文件;
# du -sh *50M log.txt               
29M     newlogaa
22M     newlogab
# file *                           //分割后的文件与原文件属性一样
log.txt: ASCII text, with very long lines, with CRLF line terminators
newlogaa: ASCII text, with very long lines, with CRLF line terminators
newlogab: ASCII text, with very long lines, with CRLF line terminators

  方法二、dd 分割

# dd bs=20480 count=1500 if=log.txt of=newlogaa            //按大小分第一个文件
# dd bs=20480 count=1500 if=log.txt of=newlogab skip=1500  //将大小之后的生成另一个文件

  方法三、head + tail 分割

# head -n `echo $((208363/2+1))` log.txt > newloga.txt       //前x行重定向输出到一个文件中;
# tail –n `echo $((208363-208362/2-1))` log.txt >newlogb.txt //后x行重定向输出到一个文件中;

  方法四、awk 分割

#awk '{if (NR<120000) print $0 >"newloga.txt";if (NR>=120000) print $0>"newlogb.txt"}' log.txt

  以上四种方法,除了dd之外的三种方式都可以很好的整行分割日志文件。进行分割时,应考虑在读一次文件的同时完成,如不然,按下面的方式分割:

Cat log.txt| head –12000 >newloga.txt
Cat log.txt | tail –23000 >newlogb.txt

  那么执行第二行命令时,前 x 行是白白读一遍的,执行的效率将很差,如文件过大,还可能出现内存不够的情况。


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 linux分割去重合并文件编辑 的文章

 本文最后更新于 2017/03/31 13:58:27,可能因经年累月而与现状有所差异

 引用转载请注明:VirCloud's Blog > 系统 > Linux 实用工具-文件合并、去重、分割