Linux下文本常用处理技巧
2015-08-23 20:36
381 查看
在Linux系统下常用的脚本技巧
在Linux使用过程中,对文件进行简单处理是经常会遇到的。如果会写一些简单的shell脚本,可以非常高效且迅速的实现。比如进行一些去重,排序,合并,预处理等。Sed和Awk是两个很强大的工具,使用这两个工具可以在使用很少的几行代码快速解决很多复杂的问题。这里分享几个常用的sed,awk实例,帮助大家快速上手进行一些文件的预处理。下面我们以一个3000000行的文件为例,来介绍几个常用的编辑处理脚本。
场景1:第一列数据相同,则第N列数据累加
输入数据: 55 2068870351 80 13 2115249545 9 32 495625872 1 42 1990048054 3 44 2314768737 1 53 1090424700 197 19 1943278105 7 19 1713692517 1 50 1041581028 11 59 43828334 52
实现脚本: $cat tmp | awk '{print $1,$3}' | awk '{a[$1]+=$2;}END{for (i in a) print i,a[i];}' | sort -nrk1 > tmp1; 返回结果: $cat tmp1 63 33373905 62 37142052 61 37997106 60 33018517 59 46855456 58 39230729 .. 1 34158015 0 52804783 关键点解释: 用awk提取第一列,第三列信息。因awk是一行一行读取,把第一列作为数组标示,第二列的数据累加。最后在END处打印所有读取的信息。最后以第一列逆序排序。 执行时间对比: $time real 0m2.458s user 0m2.372s sys 0m0.091s 从这里大家可以看出,我们只花了2.45s就能完成一个三千万文件的遍历和列累加,效率还是杠杠的。
场景2:对多个文件内容进行合并,以及排序
输入数据: ==> tmp1 <== 63 33373905 62 37142052 61 37997106 ==> tmp2 <== 34386 63 34699 62 34372 61
实现脚本: $paste tmp2 tmp1 | awk '{print $2,$1,$4}' | sort -k2,2nr -k3,3nr > result.txt 返回结果: 8 35097 42652653 51 34945 41733369 5 34912 45073340 30 34775 52006607 0 34729 52804783 关键点解释: 使用paste可以让两个文件列合并,后面使用sort分别对第二,三列数据进行排序。针对这类文件处理列合并加排序,用脚本可以非常迅速的输出结果,且非常高效。 执行时间对比: $time real 0m0.002s user 0m0.000s sys 0m0.003s
场景3:对一个文件常用修改操作
在文件的修改中,可以使用sed命令帮助大家修改。这里列一些常见的命令。实现功能:把一行中的内容A修改成B, 内容C修改成D。 $cat 1.txt anc&and.q=1234&asdsadfg anc 1234 asd dfgf12 dfg 2345 脚本: $sed -e 's/anc/test_anc/g; s/asd/ASD/g' 1.txt 输出结果: test_anc&and.q=1234&ASDsadfg test_anc 1234 ASD dfgf12 dfg 2345
实现功能:把一行中包含and.q的行中的1234替换成test1234 $sed '/and.q/s/1234/test123/' 1.txt anc&and.q=test123&asdsadfg anc 1234 asd dfgf12 dfg 2345
实现功能:把一行中包含and.q的行中的1234替换成test1234 $sed '/and.q/s/1234/test123/' 1.txt anc&and.q=test123&asdsadfg anc 1234 asd dfgf12 dfg 2345
实现功能:在第二行插入内容test 123 $sed '2 i test 123' 1.txt anc&and.q=1234&asdsadfg test 123 anc 1234 asd dfgf12 dfg 2345
实现功能:在第二行后追加内容test 123 $sed '2 a test 123' 1.txt anc&and.q=1234&asdsadfg anc 1234 test 123 asd dfgf12 dfg 2345
实现功能:删除文件奇数行内容 $cat 1.txt anc&and.q=1234&asdsadfg anc 1234 asd dfgf12 dfg 2345 $sed '1~2 d' 1.txt anc 1234 dfg 2345
实现功能:删除文件偶数行内容 $sed '2~2 d' 1.txt anc&and.q=1234&asdsadfg asd dfgf12
实现功能:删除关键字anc所在的行内容 $sed '/anc/ d' 1.txt asd dfgf12 dfg 2345
看了上面这些,大家有没对sed的编辑有所了解?有兴趣的同学可以去man下sed,awk。这两个工具非常强大,能满足很多文件的处理。
相关文章推荐
- linux内核移植和根文件系统制作(二)
- Linux内核移植和根文件系统制作(一)
- linux系统查找磁盘中的大文件命令
- Linux 安装ibus极点五笔输入法备忘录
- Linux 安装ibus极点五笔输入法备忘录
- Centos7安装cobbler2.6.9自动化部署工具
- linux 截图利器-scrot
- linux 文件系统管理.txt
- linux 系统管理.txt
- linux常用命令
- linux常用命令.txt
- linux常用命令.txt
- linux关机重启命令.txt
- linux链接命令.txt
- linux目录规则
- linux权限命令
- linux软件包管理
- linux搜索命令
- linux文件命令
- linux文件压缩命令