awk сравнить массив с массивом в предыдущей строке

Pipes создает вложенные оболочки. Встроенная функция оболочки exit завершает оболочку. Это привело к неожиданному поведению в вашем случае:

> exit | exit | echo wow
wow

Советую посмотреть раздел Pipelines в man bash. Также посмотрите help exit.

-1
10.06.2019, 19:46
1 ответ

Входные данные, указанные в виде URL-адреса в комментарии, разделены табуляцией. Это означает, что мы можем проанализировать его первое поле с разделителями табуляции -как своего рода «ключ» для сравнения с другими строками. Мы не должны заботиться о разделенных пробелами словах в первом поле, но можем рассматривать все первое поле как единое целое.

BEGIN { OFS = FS = "\t" }

{
    count = $(NF - 1)
    key = $1
}

key != previous {
    if (previous != "")
        print previous, sum

    sum = 0
}

{
    sum += count
    previous = key
}

END {
    if (previous != "")
        print previous, sum
}

Эта awkпрограмма анализирует поле «счетчик» (предпоследнее поле )в count, затем использует первое поле в качестве «ключа» для последующего сравнения с ключом предыдущей строки.. Это первый блок после блока BEGIN(, который просто устанавливает разделители ввода и вывода ).

Если ключ отличается от ключа в предыдущей строке, это означает, что мы сейчас смотрим на какой-то другой набор слов. Выведите ключ и сумму предыдущей строки и сбросьте сумму.

Для всех строк увеличьте сумму на счет от этой строки и обновитеprevious(мы закончили с этой строкой, поэтому keyэтой строки являетсяprevious)следующей.

В конце вывести информацию для последней строки данных.

Вы должны запустить это, используя awk -f script.awk inputfile.

Как «один -лайнер»:

awk -F '\t' 'BEGIN{OFS=FS} {c=$(NF-1);k=$1} k!=p {if(p!="")print p,s;s=0} {s+=c;p=k} END {if(p!="") print p,s}' file
1
28.01.2020, 05:09

Теги

Похожие вопросы