Вот не такой уж и симпатичный лайнер в awk:
awk '{ if (prev && prev != $1) { print prev, sum; sum = 0 }; sum += $2; prev = $1 } END { print prev, sum }' < file.txt
Он требует, чтобы строки с одинаковым значением в первом поле были сгруппированы вместе. Если это не так, вы можете sort file.txt | awk ...
.
if command; then ...
оценивает статус выхода команды
. 0 - успех (оценивает условие как true).
Прежде всего: [
(почти) идентичен test
, поэтому он ожидает, что строка command
будет соответствовать его синтаксису.
if [ $(command) ]; then ...
оценивает строку, содержащую вывод command
. В большинстве случаев это не сработает - см. пример ниже.
[ command ] && ..
grep -l "mail" "file"
будет интерпретирован следующим образом:
grep
- строка-l
- унарный оператор, возвращающий длину следующей строки"mail"
- строка, будет передана в качестве аргумента оператору -l
"file"
- строкаВ зависимости от реализации вы получите немного разные ошибки, потому что выше приведена просьба [
оценить последовательность, состоящую из строки, числа и другой строки, без каких-либо операторов. По умолчанию [
(как и test
) является встроенной оболочкой, вы можете сравнить сообщения об ошибках с отдельным бинарником (обычно /bin/[
или /usr/bin/[
).