首页 > 解决方案 > 使用 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]}'

这个数组的问题,它会破坏客户索引数组中汽车的先前值。

标签: awk

解决方案


假设每个客户确实有一个单字名称,如您的示例中所示并且由您的代码暗示(如果没有,那么我们将使用固定宽度字段解析来识别字段 - 请参阅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),则上述内容将全部列在输出中/计算在内。


推荐阅读