当前位置: 首页 » unix(重复的事情交给我吧) » basic_description » linux文件的合并,去重,分割–cat,uniq,split,paste

linux文件的合并,去重,分割–cat,uniq,split,paste

[文章目录] x

最近Sam有些蓝瘦、香菇,不停的在重复着一些文本操作的命令,有一些小的快捷的技能整理一下。

一、两个文件的交集,并集

前提条件:每个文件中不得有重复行
1. 取出两个文件的并集(重复的行只保留一份)

2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)

3. 删除交集,留下其他的行

二:两个文件合并

一个文件在上,一个文件在下

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

paste详解:

范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起

范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一起!且仅取出前三行

例:使用chpasswd批量修改用户密码

三:一个文件去掉重复的行:

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

具体细节可以查看,cat,sort,uniq等命令的详细介绍

四:将一个大的文件分割成多个小文件:

采用一个50M大小的日志文件进行测试。
日志文件名:log.txt.gz。
文件行数:208363

方法1:split分割(这个专业额)

# 重點在那個 - 啦!一般來說,如果需要 stdout/stdin 時,但偏偏又沒有檔案,
# 有的只是 - 時,那麼那個 - 就會被當成 stdin 或 stdout ~

方法2:dd分割

分割没问题,但会出现同一行分到不同文件的情况,除非你以及日志分析系统可以“容忍”。
很简单,因为这个的分割是根据字符数来分割的。
if=filename:输入的文件名
of=finename:输出的文件名
bs=bytes:一次读写的字节数,默认是512bytes
skip=blocks:拷贝前,跳过的输入文件的前blocks块,块的大小由bs决定,意思就是从哪个块为起点。
count=blocks:只拷贝输入文件的前blocks块
上面的例子中是把原文件切割成20K大小的块,前1500块放在文件newlogaa,后面的放在文件newlogab。

方法3:head+tail 分割

方法4:awk分割

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

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

参考文献:
长颈鹿Giraffe的博客 http://www.cnblogs.com/giraffe/p/3193085.html
Bob's Blog的博客 http://blog.csdn.net/exbob/article/details/6636255 (有不错的脚本)
鸟哥私房菜 http://linux.vbird.org/linux_basic/0320bash.php#paste


下一篇 :

上一篇 :

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

$(document).ready(function(){ $("#article-index").css('display','none');});