awk '{if($0~/^>.*$/) {tmp=$0; getline; if( length($0)>=200) {print tmp"\n"$0; } }}' filename awk '{if($0~/^>.*$/) {IGNORECASE=1; if($0~/PREDICTED/) {getline;} else {print $0; getline; print $0; } }}' filename awk '{if($0~/^>.*$/) {IGNORECASE=1; if($0~/mRNA/) {print $0; getline; print $0; } else {getline;} }}' filename awk '{ temp=$0; getline; if($0~/unavailable/) {;} else {print temp"\n"$0;} }' filename
substr($4,20) ---> 表示是从第4个字段里的第20个字符开始,一直到设定的分隔符","结束.
substr($3,12,8) ---> 表示是从第3个字段里的第12个字符开始,截取8个字符结束.
一、awk字符串转数字
$ awk 'BEGIN{a="100";b="10test10";print (a+b+0);}' 110 #只需要将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略。
二、awk列 、行相互转换
将一行内容根据逗号分割为一列
cat filename |awk -F ',' '{ i = 1; while ( i <= NF ) {print $i; i++}}'
将一列内容根据逗号转换为一行
awk '{printf "%s,",$1}' filename
三、awk数字转为字符串
$ awk 'BEGIN{a=100;b=100;c=(a""b);print c}' 100100 #只需要将变量与””符号连接起来运算即可。
四、awk字符串连接操作(字符串连接;链接;串联)
$ awk 'BEGIN{a="a";b="b";c=(a""b);print c}' ab $ awk 'BEGIN{a="a";b="b";c=(a+b);print c}' 0
把文件中的各行串联起来:
awk 'BEGIN{xxxx="";}{xxxx=(xxxx""$0);}END{print xxxx}' temp.txt awk 'BEGIN{xxxx="";}{xxxx=(xxxx"\",\""$0);}END{print xxxx}' temp.txt
提取满足条件的子字符串:
cat > temp 74938 A>G 347589B>C43795743 awk '{x=$0;while (match(x, "[A-Z]>[A-Z]") > 0) { print substr(x, RSTART, RLENGTH); x = substr(x, RSTART+RLENGTH);} }' temp
五、awk计算百分比和平均值
//计算百分比
#计算百分比 success_count=89 interface_count_total=100 awk 'BEGIN{printf "%.8f%\n",'${success_count}'/'${interface_count_total}'*100}'
//计算平均值
cat file 1 2 3 4 #计算平均值 awk '{sum+=$1}END{print sum/NR}' file #求各行数占总数的百分比: awk '{a[NR]=$1;sum+=$1}END{for(i=1;i<=NR;i++)printf "%.2f%\n", a[i]*100/sum}' file 10.00% 20.00% 30.00% 40.00%
六、awk打印第N列后面的所有列
1、使用awk将文件的前12列替换为空。
awk '{for(i=1;i<=12;i++)$i="";print $0}' localhost_access_log.2015-01-03.txt //写法一 awk '{for(i=1;i<=12;i++){$i=""};print $0}' localhost_access_log.2015-01-03.txt //写法二 awk '{for(i=13;i<=NF;i++)printf $i" ";printf "\n"}' localhost_access_log.2015-01-03.txt //写法三
2、第二步我们就只需要处理每行前面的12个空格即可,假设我们已经将上面的结果重定向到了5201351.txt文件,这时我们再使用sed命令。
[root@5201351 ~]# sed 's/^ *//' 5201351.txt //这样只能匹配空格开头 [root@5201351 ~]# sed 's/^\s*//' 5201351.txt //也可以这样写,除了空格还可以匹配制表符 [root@5201351 ~]# sed 's/^[[:space:]]*//' 5201351.txt //也可以这样写,除了空格还可以匹配制表符
这样我们就完美的解决了我们的需求,只过滤出日志文件第12列以后所有的内容。
七、awk统计文件中某关键词出现次数
1、累加第二列的数值
awk '{a=a+$2}END{print a}' file
2、若第三列的内容相同,则累加对应记录的第二列数值
awk '{a[$3]+=$2}END{for(i in a) printf "%s\t %d\n",i,a[i]}' file
3、对其他列的内容进行限制筛选以后累加第二列的数值
awk '$4=="abc" && $5>=100 && $6<=500{a=a+$2}END{print a}' file
4、若第三列,第四列内容相同,则累加第二列的数值,并将结果升序输出
awk '{a[$3,"\t",$4]+=$2}END{for(i in a)printf "%s\t %d\n",i,a[i]}' file|sort
5、统计文件test.txt中第2列不同值出现的次数