Так много (небольшие) вариации на та же тема.
awk '
!($1 in a) {a[$1]=$2; next}
{a[$1]-=$2}
END {for (i in a) printf "%s %d\n",i,a[i]}
' input.txt
Уложите его как однострочный вкладыш, если хотите.
Помните, что структура awk состоит из нескольких пар condition { statement }
, поэтому вы можете иногда выражать свои требования более элегантно, чем использовать if..else
. (Не говоря, что это имеет место здесь - это достаточно простой awk-скрипт, который, вероятно, не имеет значения, если вы не пурист.:])
Кроме того, остерегайтесь тестирования значений так, вы сделали в состоянии в вашем if
в вопросе. Обратите внимание, что в a[$1]
оба параметра проверяют, является ли значение в индексе этого массива отличным от нуля. и заставляет индекс существовать с нулевым значением, если он ранее не существовал. Если вы хотите проверить наличие индекса, используйте $1 in a
.
Обновление на основе комментариев на ваш вопрос ...
Если вы хотите вычесть последний из первого входа, игнорируя те, которые между ними, то вам необходимо держать запись ваших первых и ваших последних. Что-то вроде этого может быть достаточно.
awk '
!($1 in a){a[$1]=$2;next}
{b[$1]=$2}
END {for(i in b)if(i in a)print i,a[i]-b[i]}
' input.txt
Обратите внимание, что, как упоминает Эд, это производит выход в случайном порядке. Если вы хотите, чтобы результат был заказан, вам понадобится дополнительный массив для отслеживания заказа. Например, это будет использовать порядок, предметы первой видели:
awk '
!($1 in a) {
a[$1]=$2;
o[++n]=$1;
next
}
{
b[$1]=$2
}
END {
for (n=1;n<=length(o);n++)
print o[n],a[o[n]]-b[o[n]]
}
' i
Обратите внимание, что функция length()
которая используется для определения количества элементов в массиве не является универсальным среди диалектов AWK, но он работает в обоих gawk и one-true-awk (используется во FreeBSD и др.).
Что произойдет, если значение в первом столбце повторяется более одного раза? – ghoti
В этом случае я хочу взять первое и последнее вхождения – Vicky
Ни одно из размещенных решений не сделало бы этого, все, что они делают, - это работа для образца с двумя входами, который вы предоставили (и все, кроме моего, без необходимости сохраняют половину ввода в массиве а затем производить вывод в случайном порядке, а не только порядок считывания ключевых значений, который может быть или не быть желательным). –