awk脚本格式化文本实例
场景:现有如下文本文件score.txt,我想输出score_awk.txt格式的文本。
#score.txt(name,no,math,english,computer)
tom 1 90 98 100
jerry 3 80 90 89
carl 2 99 95 88
luna 4 84 74 80
#score_awk.txt
NAME NO MATH ENGLISH COMPUTER TOTAL
-----------------------------------
tom 1 90 98 100 288
jerry 3 80 90 89 259
carl 2 99 95 88 282
luna 4 84 74 80 238
-----------------------------------
TOTAL: 353 357 357
AVERAGE:88.25 89.25 89.25
可以先分析一下最终输出的格式文本的特点:
1、第一行和第二行表头 ->这两行不需要读取score.txt中的数据,故我们放在awk的BEGIN部分直接打印出来;
2、中间主体数据 ->读取score.txt文本,放在主循环的代码段中直接输出;
3、最后三行 ->读取score.txt文本,最后两行需要通过运算得出,所以可以放在读取文件之后的代码段即END部分。
awk -f cal.awk score.txt>score_awk.txt
#!/bin/bash
BEGIN {
math=0
english=0
computer=0
printf "NAME NO MATH ENGLISH COMPUTER TOTAL\n"
printf "-----------------------------------\n"
}
{
math+=$3
english+=$4
computer+=$5
printf "%-5s %-3s %-5s %-7s %-7s %-6s\n",$1,$2,$3,$4,$5,$3+$4+$5
}
END{
printf "-----------------------------------\n"
printf " TOTAL:%4d %5d %7d \n",math,english,computer
printf "AVERAGE:%4.2f %5.2f %7.2f \n ", math/NR, english/NR, computer/NR
}
NR:文本的行数,在这里即为score.txt的行数;
\n:换行;
%nd:格式化输出,表示输出n个字节的空间;
%nf:表示输出n位小数的浮点型数据(float)。