我有一个名为 data.txt 的管道分隔文本文件,例如...
Kalpesh|100|1
Kalpesh|500|1
Ramesh|500|1
Ramesh|500|1
Ramesh|500|1
Naresh|500|1
Ganesh|500|1
Ganesh|500|1
Ganesh|500|1
Ganesh|500|1
我正在使用awk
如下脚本:
awk -F"|" 'BEGIN { ln=0;slno=0;pg=0; }
{
name=$1;
{
if (name !=x||ln > 50) #if same name repeates more than 50times then new page
{
tot=0;
pg++;
printf("\f");
print "PERSONS HAVING OUTSTANDING ADVANCE SALARY"
print "+==============================+"
print "|Sr.| name |Amount Rs.|Nos |"
print "+==============================+"
ln=0;
}
if (name!=x)
slno=1;tot+=$2;
{
printf ("|%3s|%10s|%10.2f|%4d|\n",slno,$1,$2,$3,tot,$4);
ln++;
slno++;
x=name;
}
}
} END {
print "================================"
print "Total for",$1,slno,tot
print "================================"
print "\f" }' data.txt
这给出了类似的结果
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Kalpesh| 100.00| 1|
| 2| Kalpesh| 500.00| 1|
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Ramesh| 500.00| 1|
| 2| Ramesh| 500.00| 1|
| 3| Ramesh| 500.00| 1|
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Naresh| 500.00| 1|
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Ganesh| 500.00| 1|
| 2| Ganesh| 500.00| 1|
| 3| Ganesh| 500.00| 1|
| 4| Ganesh| 500.00| 1|
================================
Total for Ganesh 5 2000
================================
我想要的输出就像
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Kalpesh| 100.00| 1|
| 2| Kalpesh| 500.00| 1|
================================
Total for Kalpesh 2 600
================================
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Ramesh| 500.00| 1|
| 2| Ramesh| 500.00| 1|
| 3| Ramesh| 500.00| 1|
================================
Total for Ramesh 3 1500
================================
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Naresh| 500.00| 1|
================================
Total for Naresh 1 500
================================
PERSONS HAVING OUTSTANDING ADVANCE SALARY
+==============================+
|Sr.| name |Amount Rs.|Nos |
+==============================+
| 1| Ganesh| 500.00| 1|
| 2| Ganesh| 500.00| 1|
| 3| Ganesh| 500.00| 1|
| 4| Ganesh| 500.00| 1|
================================
Total for Ganesh 5 2000
================================
编辑:
Ed Mortons的回答更好,请使用它。
主要逻辑:
$1
)total
$2
将每个条目相加entry
保留每个$2
条目的列表nos
保留每个$3
条目的列表$2
条目列表,给出该k
名称的条目数,$3
列表也被拆分(它应该具有相同的条目数)i=1
) 开始,打印每个条目i mod 50
是1
打印标题 - 这将每五十个条目打印一个新标题print_entry
使主要动作更清晰,更易于阅读,并且在END
动作中再次使用它,因此将其定义为函数可以避免重复.