awk行号相关的操作,个人认为写的非常好
转自:http://www.plob.org/2011/03/18/97.html
一. 行距:
1. 每行间加一个空行
1 awk '1; { print "" }'
2 awk '1 { print } { print "" }'
3 awk '{ print } { print "" }'
2. 1的另外一种实现方法:
1 awk 'BEGIN { ORS="\n\n" }; 1'
3. 仅输出非空行,并每行间在加一个空行
1 awk 'NF { print $0 "\n" }'
4. 双倍行距;没行间两个空行
1 awk '1; { print "\n" }'
等同于:
1 awk '{ print; print "\n" }'
5. 显示当前行在所在文件中的行号
1 awk '{ print FNR "\t" $0 }'
6. 显示当前行在本次处理过程中的行号
1 awk '{ print NR "\t" $0 }'
小疑问:为啥有FNR和NR的差别呢?效果不都是一样么? 如果你给如:filname1.ext filname2.ext,你就会看到差别了。原来:FNR,是每个文件中的,换了一个文件,会归零;而NR则每个文件会累加起来的
7. 使用简单样式来输出
1 awk '{ printf("] : %s\n", NR, $0) }'
8. 显示非空行
1 awk 'NF { $0=++a " :" $0 }; { print }'
2 #NF前面说了,表示当前行的行号,此处用他作为条件,如果是空行,则NF为0,跳过;否则,用动态变量a存储非空行的数目
9. 计算行数:效果类似wc -l
1 awk 'END { print NR }'
10. 计算每一行的和
1 awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }'
#s用作每行和的累加,从1到NF(每行总的字段数),依次累加
11. 计算文件中所有字段的和
1 awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }'
2 #s用作总和的累加,每行都处理完成了,再输出s;注意和10对比,此处没有每行清零,所以累加了。没有设置的变量,默认为空,但是会根据上下文数值计算情况自动变为0
12. 将每个字段用其绝对值代替
1 awk '{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }'
2 #$i表示当前行中的字段,$0表示当前行,可以改变$i的值
13. 计算文件中总的字段和(例如计算单词数)
1 awk '{ total = total + NF }; END { print total }'
14. 计算匹配指定信息的总行数
1 awk '/Linux/ { n++ }; END { print n+0 }'
15. 找到文件中每行第一个字段中,最大的数,以及其所在的行
1 awk '$1 > max { max=$1; maxline=$0 }; END { print max, maxline }'
2 #用max存储最大的数,maxline存储最大数所在的行,并在最后输出
16. 显示当前行的字段数,并输出当前行
1 awk '{ print NF ":" $0 } '
17. 显示每行最后一个字段的内容
1 awk '{ print $NF }'
18. 显示最后一行的最后一个字段
1 awk '{ field = $NF }; END { print field }'
2 #每行处理没有输出,尽在最后输出,field作为每行的最后一行的暂存变量
19. 显示字段数小于4的行
1 awk 'NF < 4'
20. 显示每行的最后一个字段小于4的行
1 awk '$NF < 4'