Chinaunix

标题: 常用文本处理操作命令总结 [打印本页]

作者: 怿_mao44    时间: 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
复制代码

作者: zooyo    时间: 2012-11-11 16:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: kernel69    时间: 2012-11-11 18:49
必须顶起,看来perl还是要看一看的
作者: dn833    时间: 2012-11-11 19:51
好文,都是日积月累的
作者: mcshell    时间: 2012-11-11 22:05
:wink:拜膜一下楼主




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2