1. 生成數據報表
有一個數據文件datafile是某位業務員的客戶們3個月來的交易統計。datafile中的數據以冒號為分隔符,分了5個字段,分別為用戶的name,電話phone,1月的消費金額,2月的消費金額,3月的消費金額, 要求:(1)生成人可讀的數據報表,格式清晰 (2)生成每位客戶(每行記錄)的3個月的消費總數,以及每個月的總營業額; awk腳本: report.awk#!/usr/bin/awk -f
# 生成數據報表
BEGIN {
FS =":";
OFS ="\t"
print "\t\t Report tables"
print "name\tphone\t\tJan\tFeb\tMar\t\tTotal"
print "——————————————————————————————————————————————————————"
}
# 求客戶3個月的業績和
{$6 = $3 + $4 + $5}
#{printf "%-8s%-15s%-9s%-8s%-15s%-12s\n", $1,$2,$3,$4,$5,$6}
{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t\t"$6}
{total3 +=$3}
{total4 +=$4}
{total5 +=$5}
END {
print "_______________________________________________________"
print "This is Jan total: " total3
print "This is Feb total: " total4
print "This is Mar total: " total5
}
[root@web1 test]# awk -f report.awk datafile
Report tables
name phone JanFebMarTotal
——————————————————————————————————————————————————————
M H (424)2222233299242332322332863
N H (423)223424234532422323819
N J (334)19923322343424232434800
_______________________________________________________
This is Jan total:878
This is Feb total:37726
This is Mar total:332878
vim join.awk
# 替換文件的域
BEGIN {
# 指定輸出分隔符
OFS =":"
# 輸入字段分隔符
FS =":"
}
# 執行體
{
if(NR <= FNR){# 正在處理第一個輸入文件shadow
a[$1]= $2
}
if(NR > FNR){# 正在處理第二個輸入文件passwd
$2 = a[$1]
print
}
}
awk -f join.awk /etc/shadow /etc/passwd > passwd.pub
# 執行體
NR <= FNR {# 正在處理第一個輸入文件shadow
a[$1]= $2
}
NR > FNR {# 正在處理第二個輸入文件passwd
$2 = a[$1]
# 輸出一整條記錄==print $0
print
}
# check passwd
BEGIN {
FS =":"
}
# 執行體
NF !=7{ // 引用內建變量NF 做判斷
printf("line %d, does not have 7 fields: %s\n", NR, $0)
}
$1 !~/[a-zA-Z0-9]/{ // !~ 不匹配正則
printf("line %d, non alpha and nnumeric user id: %s\n", NR, $0)
}
$2 =="*"{ // == 語法類似於C語言
printf("line %d, no password: %s\n", NR, $0)
}
#!/usr/bin/awk -f
# 生成數據報表
BEGIN {
FS =":";
OFS ="\t"
print "\t\t Report tables"
print "name\tphone\t\tJan\tFeb\tMar\t\tTotal"
print "——————————————————————————————————————————————————————"
}
# 求客戶3個月的業績和
{$6 = $3 + $4 + $5}
#{printf "%-8s%-15s%-9s%-8s%-15s%-12s\n", $1,$2,$3,$4,$5,$6}
{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t\t"$6}
{total3 +=$3}
{total4 +=$4}
{total5 +=$5}
END {
print "_______________________________________________________"
print "This is Jan total: " total3
print "This is Feb total: " total4
print "This is Mar total: " total5
}
[root@web1 test]# awk -f report.awk datafile
Report tables
name phone JanFebMarTotal
——————————————————————————————————————————————————————
M H (424)2222233299242332322332863
N H (423)223424234532422323819
N J (334)19923322343424232434800
_______________________________________________________
This is Jan total:878
This is Feb total:37726
This is Mar total:332878
vim join.awk
# 替換文件的域
BEGIN {
# 指定輸出分隔符
OFS =":"
# 輸入字段分隔符
FS =":"
}
# 執行體
{
if(NR <= FNR){# 正在處理第一個輸入文件shadow
a[$1]= $2
}
if(NR > FNR){# 正在處理第二個輸入文件passwd
$2 = a[$1]
print
}
}
awk -f join.awk /etc/shadow /etc/passwd > passwd.pub
# 執行體
NR <= FNR {# 正在處理第一個輸入文件shadow
a[$1]= $2
}
NR > FNR {# 正在處理第二個輸入文件passwd
$2 = a[$1]
# 輸出一整條記錄==print $0
print
}
# check passwd
BEGIN {
FS =":"
}
# 執行體
NF !=7{ // 引用內建變量NF 做判斷
printf("line %d, does not have 7 fields: %s\n", NR, $0)
}
$1 !~/[a-zA-Z0-9]/{ // !~ 不匹配正則
printf("line %d, non alpha and nnumeric user id: %s\n", NR, $0)
}
$2 =="*"{ // == 語法類似於C語言
printf("line %d, no password: %s\n", NR, $0)
}
Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm
Linux系統之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm
AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm
Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm
Linux文本處理工具之awk http://www.linuxidc.com/Linux/2015-01/111437.htm
如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm
文本分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm
AWK入門基礎教程 http://www.linuxidc.com/Linux/2016-12/138138.htm
使用awk格式化輸出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm