免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2005 | 回复: 4
打印 上一主题 下一主题

[文本处理] 常用文本处理操作命令总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-11 15:47 |只看该作者 |倒序浏览

linux基本操作
1)查看系统中有多少CPU
  1. $ cat /proc/cpuinfo |grep 'processor'|wc -l
复制代码
1.截取文件

1)以冒号为分隔符时,输出部分列
  1. $ perl -F: -lane 'print"@F[5..9] $F[3]"' file
复制代码
等于
  1. $ awk '{FS=":"}{print $6,$7,$8,$9,$10,$4}' file
复制代码
衍生
  1. $ perl -F: -lane 'print"@F[5..9] @F[0..3]"' file
复制代码
2)显示START和END之间的部分
  1. $ perl -ne 'print if /^START$/../^END$/' file
复制代码
相反,不显示START和END之间的部分
  1. $ perl -ne 'print unless /^START$/../^END$/' file
复制代码
3)显示开头50行:
  1. $ perl -pe 'exit if $.>50' file
复制代码
等于
  1. $ head -50 file
复制代码
不显示开头10行,从11行开始显示:
  1. $ perl -ne 'print unless 1..10' file
复制代码
显示10行到15行,共六行记录:
  1. $ perl -ne 'print if 10..15' file
复制代码
每行取前10个字符:
  1. $ cut -c 1-10  file
复制代码
2.查找

1)查找字符串
  1. $ perl -ne 'print if /abc/' file
复制代码
等于
  1. $ grep abc file
复制代码
衍生
  1. $ grep -c abc file      ##输出能匹配字符串的行数目,-c=count lines  
复制代码
  1. $ grep -v abc file        ##输出不包含指定字符串的行   
复制代码
输出能同时匹配两个指定字符串的记录
  1. $ perl -ne 'print if /abc/&&/ABC/' file  
复制代码
等于
  1. $ awk '/abc.*ABC/' file  
复制代码
衍生
  1. $ perl -ne 'print if /abc/&&/ABC/' file        ##能匹配其中一个字符串即可
复制代码
2)输出第三列中成功匹配字符串的记录,和所在的行数
  1. $ awk '{m++;if($3~/ABC/){print m ":\t" $0}}' file
复制代码
3)删除能匹配的记录
  1. $ sed -e "/ABC/d" file
复制代码
3.计算
1)计算第二列数值总和
  1. $ awk '{a=a+$2}END{print a}' file  
复制代码
衍生,需要在对第二列中内容进行替换后,再计算每个记录出现的个数
输入文件:
aa        abc        11
bb        NO_2abc        12
cc        cba        22
  1. $ cut -f 2 file| sed 's/NO\_[1-9]//g'|sort|uniq -c
  2. 2 abc
  3. 1 cba
复制代码
2)计算每一行的第二列与倒数第二列的数值之和
  1. $ perl -lane 'print $F[1]+$F[-2]' file
复制代码
等于
  1. $ awk '{i=NF-2;print $2+$i}'file
复制代码
3)当第二列内容相同时,累加对应第三列的数值
  1. $ awk '{a[$3]+=$2}END{for(i in a)printf "%s\t %d\n",i,a[i]}' file |sort
复制代码
4.排序去重复
1)对第三列进行排序后,根据第三列对文件进行去重复,第三列相同的记录只保留一行
  1. $ sort -k3 file |awk '!a[$3]++'
复制代码
2)并不是以每一行为单位进行去重复,而是以“@”符为分隔符划分单位后进行去重复
  1. $ awk '/@/{i=$0;a[i]=0;next}{a[i]=a[i]?a[i]"\n"$0:$0}END{for(i=0;i++<asorti(a,b);)print b[i]"\n"a[b[i]]}'  file
复制代码
5.批量对压缩文件解压缩
  1. $ ls *.tar|awk '{print "tar xvf "$0}'|sh
复制代码
6.匹配
  1. $ paste -d "\t" fileA fileB  ##不进行任何比较,直接合并两个文件中对应行记录
复制代码
1)两个文件之间输出匹配(文件一的第一列,匹配文件二中的第二列)记录,同时输出匹配成功的记录,两个文件可以包含重复记录
  1. $ awk 'NR==FNR{key[$1]++;a[$1 FS key[$1]]=$0;next} $2 in key {for (i=1;i<=key[$2];i++) print a[$2 FS i], $0}' OFS="\t" fileA fileB
复制代码
2)当两个文件中记录为去重复以后的记录,提取在文件一中第一列无法成功匹配文件二第二列的记录
  1. $ awk 'NR==FNR{a[$1]=$0}NR>FNR{b[$2]=$0}END{for(i in a){ flag=0;for(j in b) {if(i==j){flag=1}} if(!flag)print a[i]}}' fileA fileB
复制代码
3)当两个文件中的第一列内容相同时,则合并两个文件记录内容存为“count.comm”,若只在文件一中存在的记录存为“only.fileA”,而只在文件二中存在的记录存为文件“only.fileB”
  1. $ awk 'NR==FNR{f1[$1]=$0;next}$1 in f1{printf $0"\t"f1[$1] RS > "count.comm";delete f1[$1];next}{print > "only.fileA"}END{for(s in f1)print f1[s] > "only.fileB"}' fileB fileA  
复制代码
4)需要同时匹配两个文件中两个不同的列,文件一的第二列和第三列要同时能成功匹配到文件二的第三列和第四列
  1. $ awk 'NR==FNR{a[$2 FS $3]=$0;next}$3 FS $4 in a {print a[$3 FS $4] "\t"  $0}' fileA fileB
复制代码
或者 $ awk 'ARGIND==1 {a[$2$3]=$0} ARGIND>1&&($3$4 in a) {print a[$3$4],$0}' file1 file2 [/code]

5)根据“@”进行单位划分后,再部分匹配记录
输入文件一:
NO_222333        222        abc
NO_54321        123        aa
NO_123456        234        bac
NO_5432123        321        bbb
输入文件二:
@ab|abc|NO_12345.1|abcd aa bb cc
abcdefghigkabcdefghigkabcdefghigk
abcdefghigkabcdefghigkabcdefghigk
abcdefghigkabcdefghigkabcdefghigk
@ab|cba|NO_54321.1|abcd aa bb aa
cbadefghigkcbadefghigkcbadefg
cbadefghigkcbadefghigkcbadefg
@ab|cba|NO_5432123.2|abcd aa aa
abcdefghigkabcdefghigkabcdefghigk
abcdefghigkabcdefghigkabcdefghigk
cbadefghigkcbadefghigkcbadefg
cbadefghigkcbadefghigkcbadefg
  1. $ awk 'NR==FNR{a[$1];next}/@/{split($0,b,"[|.]");if(b[3] in a)(t=1);else{t=0}}t' file1 file2
  2. @ab|cba|NO_54321.1|abcd aa bb aa
  3. cbadefghigkcbadefghigkcbadefg
  4. cbadefghigkcbadefghigkcbadefg
  5. @ab|cba|NO_5432123.2|abcd aa aa
  6. abcdefghigkabcdefghigkabcdefghigk
  7. abcdefghigkabcdefghigkabcdefghigk
  8. cbadefghigkcbadefghigkcbadefg
  9. cbadefghigkcbadefghigkcbadefg
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2012-11-11 16:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
3 [报告]
发表于 2012-11-11 18:49 |只看该作者
必须顶起,看来perl还是要看一看的

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
4 [报告]
发表于 2012-11-11 19:51 |只看该作者
好文,都是日积月累的

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2012-11-11 22:05 |只看该作者
:wink:拜膜一下楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP