awk 命令使用入门基础详解(9)

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列不同值出现的次数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11866.html