- 论坛徽章:
- 0
|
linux基本操作
1)查看系统中有多少CPU- $ cat /proc/cpuinfo |grep 'processor'|wc -l
复制代码 1.截取文件
1)以冒号为分隔符时,输出部分列- $ perl -F: -lane 'print"@F[5..9] $F[3]"' file
复制代码 等于- $ awk '{FS=":"}{print $6,$7,$8,$9,$10,$4}' file
复制代码 衍生- $ perl -F: -lane 'print"@F[5..9] @F[0..3]"' file
复制代码 2)显示START和END之间的部分- $ perl -ne 'print if /^START$/../^END$/' file
复制代码 相反,不显示START和END之间的部分- $ perl -ne 'print unless /^START$/../^END$/' file
复制代码 3)显示开头50行:- $ perl -pe 'exit if $.>50' file
复制代码 等于不显示开头10行,从11行开始显示:- $ perl -ne 'print unless 1..10' file
复制代码 显示10行到15行,共六行记录:- $ perl -ne 'print if 10..15' file
复制代码 每行取前10个字符:2.查找
1)查找字符串- $ perl -ne 'print if /abc/' file
复制代码 等于衍生- $ grep -c abc file ##输出能匹配字符串的行数目,-c=count lines
复制代码- $ grep -v abc file ##输出不包含指定字符串的行
复制代码 输出能同时匹配两个指定字符串的记录- $ perl -ne 'print if /abc/&&/ABC/' file
复制代码 等于衍生- $ perl -ne 'print if /abc/&&/ABC/' file ##能匹配其中一个字符串即可
复制代码 2)输出第三列中成功匹配字符串的记录,和所在的行数- $ awk '{m++;if($3~/ABC/){print m ":\t" $0}}' file
复制代码 3)删除能匹配的记录3.计算
1)计算第二列数值总和- $ awk '{a=a+$2}END{print a}' file
复制代码 衍生,需要在对第二列中内容进行替换后,再计算每个记录出现的个数
输入文件:
aa abc 11
bb NO_2abc 12
cc cba 22- $ cut -f 2 file| sed 's/NO\_[1-9]//g'|sort|uniq -c
- 2 abc
- 1 cba
复制代码 2)计算每一行的第二列与倒数第二列的数值之和- $ perl -lane 'print $F[1]+$F[-2]' file
复制代码 等于- $ awk '{i=NF-2;print $2+$i}'file
复制代码 3)当第二列内容相同时,累加对应第三列的数值- $ awk '{a[$3]+=$2}END{for(i in a)printf "%s\t %d\n",i,a[i]}' file |sort
复制代码 4.排序去重复
1)对第三列进行排序后,根据第三列对文件进行去重复,第三列相同的记录只保留一行- $ sort -k3 file |awk '!a[$3]++'
复制代码 2)并不是以每一行为单位进行去重复,而是以“@”符为分隔符划分单位后进行去重复- $ 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.批量对压缩文件解压缩- $ ls *.tar|awk '{print "tar xvf "$0}'|sh
复制代码 6.匹配- $ paste -d "\t" fileA fileB ##不进行任何比较,直接合并两个文件中对应行记录
复制代码 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)当两个文件中记录为去重复以后的记录,提取在文件一中第一列无法成功匹配文件二第二列的记录- $ 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”- $ 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)需要同时匹配两个文件中两个不同的列,文件一的第二列和第三列要同时能成功匹配到文件二的第三列和第四列- $ 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- $ awk 'NR==FNR{a[$1];next}/@/{split($0,b,"[|.]");if(b[3] in a)(t=1);else{t=0}}t' file1 file2
- @ab|cba|NO_54321.1|abcd aa bb aa
- cbadefghigkcbadefghigkcbadefg
- cbadefghigkcbadefghigkcbadefg
- @ab|cba|NO_5432123.2|abcd aa aa
- abcdefghigkabcdefghigkabcdefghigk
- abcdefghigkabcdefghigkabcdefghigk
- cbadefghigkcbadefghigkcbadefg
- cbadefghigkcbadefghigkcbadefg
复制代码 |
|