Использование Awk для поиска уникальных автомобилей, купленных клиентом - PullRequest
0 голосов
/ 28 мая 2019

У меня есть такие файлы журналов (это только пробел между ними, но для удобства я изменил это):

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

Я не могу знать, как это сделать.

Я думаю, что должен создать массив для Customer и один для автомобиля и проиндексировать его номером строки

awk ' { Customer[NR]=$1; Car[NR]=$2} END {}'

Что мне добавить в КОНЦЕ, я немного озадачен

Я тоже так думал:

awk ' { Customer[$1]=$2} END { for (i in Customer) print i,Customer[i]}'

Проблема с этим массивом, он уничтожит предыдущее значение автомобиля в индексированном массиве Customer.

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Предполагая, что у каждого клиента действительно есть имя из 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

С учетом вышеизложенного, если данный клиент покупает автомобиль одного и того же типа (например, Peugeot 508) в несколько дат, все они будут перечислены / подсчитаны в выходных данных.

0 голосов
/ 28 мая 2019

Для этих данных я бы использовал Splunk.Он может анализировать до 500 МБ каждый день бесплатно.Вы можете получать любые отчеты и графики, что вам нравится.

0 голосов
/ 28 мая 2019

Если вас не беспокоит порядок вывода (который не должен совпадать с 1-м полем Input_file), пожалуйста, попробуйте выполнить следующее.

awk '
FNR>1{
  match($0,/ +.* +/)
  var=substr($0,RSTART,RLENGTH)
  gsub(/^[[:space:]]+|[[:space:]]+$/,"",var)
  a[$1]=(a[$1]?a[$1] OFS:"")var
  b[$1]++
}
END{
  for(i in a){
    print i","a[i]",number of cars: "b[i]
  }
}
'   Input_file


РЕДАКТИРОВАТЬ: Добавление решения, которое будет обеспечивать вывод в том же порядке 1-го поля Input_file.

awk '
FNR>1{
  if(!b[$1]++){
    c[++count]=$1
  }
  match($0,/ +.* +/)
  var=substr($0,RSTART,RLENGTH)
  gsub(/^[[:space:]]+|[[:space:]]+$/,"",var)
  a[$1]=(a[$1]?a[$1] OFS:"")var
  d[$1]++
}
END{
  for(i=1;i<=count;i++){
    print c[i]","a[c[i]]",number of cars: "d[c[i]]
  }
}
'   Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...