使用Awk查找客户购买的独特汽车

时间:2019-05-28 12:31:35

标签: awk

我有这样的日志文件(这只是它们之间的空间,但出于可读性,我将其更改了):

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]}'

此数组存在问题,它将破坏“客户索引”数组中汽车的先前值。

3 个答案:

答案 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。您可以获取任何报告,并可以随意绘制图形。