我有这样的日志文件(这只是它们之间的空间,但出于可读性,我将其更改了):
Customer Car Bought
François Nissan Pajero 28/05/2016
Matthew Mercedes S 10/01/2019
Andrew Peugeot 508 05/0/2000
Matthew Toyota Hilux 02/10/2012
我需要制作一个awk脚本,该脚本为每个客户显示他这样购买的汽车:
Matthew, car bought: Mercedes S,Toyota Hilux, number of cars: 2
Francois, car bought: Nissan Pjero, number of cars: 1
我不知道该怎么做。
我认为我应该为客户创建一个数组,为汽车创建一个数组,并用行数对其进行索引
awk ' { Customer[NR]=$1; Car[NR]=$2} END {}'
我应该在END中添加些什么,我有点困惑
我还想这样做:
awk ' { Customer[$1]=$2} END { for (i in Customer) print i,Customer[i]}'
此数组存在问题,它将破坏“客户索引”数组中汽车的先前值。
答案 0 :(得分:0)
如果您不担心输出顺序(与Input_file的第一个字段不相同),那么请尝试以下操作。
$commands[]
编辑: :将添加解决方案,该解决方案将以Input_file的第一字段的相同顺序提供输出。
sql
答案 1 :(得分:0)
假设每个客户确实确实有一个1字的名称,如您的示例所示,并且由您的代码隐含(如果没有,则我们将使用固定宽度的字段解析来标识字段-请参见https://stackoverflow.com/a/31947741/1745001) :
$ cat tst.awk
NR>1 {
gsub(/^[[:space:]]+|[[:space:]]+$/,"")
cust = $1
gsub(/^[^[:space:]]+[[:space:]]+|[[:space:]]+[^[:space:]]+$/,"")
cars[cust,++numCars[cust]] = $0
custs[cust]
}
END {
for (cust in custs) {
printf "%s, car bought: ", cust
for (carNr=1; carNr<=numCars[cust]; carNr++) {
printf "%s,", cars[cust,carNr]
}
printf " number of cars: %d\n", numCars[cust]
}
}
$ awk -f tst.awk file
Andrew, car bought: Peugeot 508, number of cars: 1
Matthew, car bought: Mercedes S,Toyota Hilux, number of cars: 2
François, car bought: Nissan Pajero, number of cars: 1
通过上述方法,如果给定的客户在多个日期购买了相同类型的汽车(例如标致508),则他们都会在输出中列出/计算。
答案 2 :(得分:0)
对于此数据,我将使用Splunk
。它每天最多可以免费分析500MB。您可以获取任何报告,并可以随意绘制图形。