分类: LINUX
2015-11-24 23:34:30
awk系统变量FS&RS妙用
(1)awk脚本:
awk '
BEGIN{ FS="\n" ; RS="" }
#将字段分隔符改为\n取消记录换行符,相当于把每一行转换为一个字段,拼在同一记录中,然后针对每一字段处理,避免了统一处理时出现特殊行格式不同处理结果不同。
NF >= 3 {
for(i=3;i<=NF;++i){ #调用第三字段开始,即原本的第三行开始,避免处理了第一第二字段(原本的第一第二行)
sv=split($i, order, " ") #split函数将第三字段分拆赋值给数组,相当于原本第三行分拆
if(sv==3){
title=order[1]
copies=order[2]
price=order[3]
amount=copies*price
total_vol+=copies
total_amt+=amount
vol[title]+=copies
amt[title]+=amount
}
else
print "incomplete record"
}
}
END{
printf ("%5s\t%10s\t%6s\n\n", "TITLE", "COPIES SOLD", "TOTAL")
for(title in vol)
printf ("%5s\t%10d\t$%7.2f\n", title, vol[title], amt[title])
printf ("%s\n", "--------------")
printf ("\t%s%4d\t$%7.2f\n", "Total ", total_vol, total_amt)
}' $*
(2)目标文本
[root@redhat unit10]# cat testfile1_dingdan
charlotte webb #第一第二行接下来的格式不同
P.O N64331 97 Y 045 Date: 03/14/97
#1 3 7.50
#2 3 7.50
#3 1 7.50
#4 1 7.50
(3)输出结果:
[root@redhat unit10]# ./awkscript3_mount_max testfile1_dingdan
TITLE COPIES SOLD TOTAL
#1 3 $ 22.50
#2 3 $ 22.50
#3 1 $ 7.50
#4 1 $ 7.50
--------------
Total 8 $ 60.00