Разбор массива awk с двумя возможными расположениями полей - PullRequest
0 голосов
/ 04 мая 2020

Я хочу использовать awk для анализа текстового файла, в котором есть поля, разделенные запятыми. Мне нужно узнать, сколько раз каждое состояние встречается в файле, и найти состояние с наиболее частым возникновением. Мне также нужно выяснить, встречается ли фамилия более одного раза. Второе поле в файле соответствует фамилии, но поля 5 или 6 могут иметь названия состояний. Также первая строка текста используется для хранения имен полей, поэтому их следует пропускать. Вот часть файла данных:

First Name,Last Name,Address,City,State,Zip
Rose,Stark,9283 Vivamus Avenue,Toledo,OH,13856
Remedios,Barber,Ap #331-7101 Elit, St.,Rock Springs,WY,88149

Во второй строке состояние находится в 5-м поле, а в третьей строке - в 6-м поле. Вот мой код: ...

BEGIN { FS=","
}

{states1 [$5] += 1}

{states2 [$6] += 1}

{names [$2] += 1}

END {

    for (state in states1)
        print state, states1 [state]
    print "-----"

    for (state in states2)
        print state, states2 [state]
    print "-----"

    for (name in names)
        print name, names [name]

}

...

Как мне отфильтровать результаты, отличные от имен состояний в 5-м и 6-м полях, и как я могу распечатать состояние с помощью наиболее частое появление и фамилия, встречающиеся более одного раза?

Пример вывода, который я хочу получить, выглядит примерно так:

«Состояние с наиболее частым появлением - VA. Это происходит 8 раз.
Фамилия «Коричневый» встречается более одного раза. Встречается 3 раза. »

Заранее благодарю за вашу помощь.

1 Ответ

1 голос
/ 05 мая 2020

Вы еще не показали нам свой ожидаемый результат, так что не представляю, как это будет выглядеть, но здесь достаточно, чтобы вы начали: учитывая то, что вы поделились в комментариях под своим вопросом, создать массивы состояний и связанных фамилий вместе сколько их было бы, используя GNU awk:

awk -F, '
NR>1 { states_names[$(NF-1)][$2] }
END {
    for (state in states_names) {
        for (name in states_names[state]) {
            print state, length(states_names[state]), name
        }
    }
}' file

Обратите внимание на использование $(NF-1) вместо $5, поэтому мне не нужны запятые в предыдущих полях, состояние находится в второе-последнее поле, вот и все.

...