Делать математику в командной строке Linux - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть файл журнала с веб-сервера, который выглядит так:

1908 462
232 538
232 520
232 517

Моя задача - объединить столбец 1 и столбец 2 в скрипте bash. Мой желаемый вывод:

2604 2037

Я знаю awk или sed, которые могут иметь большое значение для решения моей проблемы, но я не могу понять, как на самом деле это сделать. Я просмотрел примеры в Google, но не нашел ничего полезного. Может кто-нибудь указать мне правильное направление, пожалуйста?

Ответы [ 4 ]

6 голосов
/ 01 декабря 2011
awk '{a += $1; b += $2} END { print a " " b }' foo.log

(Обратите внимание на полное отсутствие проверки ошибок.)

РЕДАКТИРОВАТЬ:

Хорошо, вот версия с проверкой ошибок:

awk 'BEGIN { ok = 1 } { if (/^ *[0-9]+ +[0-9]+ *$/) { a += $1; b += $2 } else { ok = 0; exit 1 } } END { if (ok) print a, b }' foo.log

Если вы не хотите принимать начальные или конечные пробелы, удалите два " *" в операторе if.

Но это достаточно много, чтобы, вероятно, не быть единичнымliner:

#!/usr/bin/awk -f

BEGIN {
    ok = 1
}

{
    if (/^ *[0-9]+ +[0-9]+ *$/) {
        a += $1
        b += $2
    }
    else {
        ok = 0
        exit 1
    }
}

END {
    if (ok) print a, b
}

По-прежнему нет проверки переполнения или недостаточного заполнения, и предполагается, что признаков не будет.Последнее достаточно легко исправить;первое будет сложнее.(Обратите внимание, что awk использует внутреннее число с плавающей точкой; если сумма достаточно велика, она может спокойно потерять точность.)

3 голосов
/ 01 декабря 2011

Попробуйте

awk '{a+=$1;b+=$2} END {print a, b}' file
0 голосов
/ 01 декабря 2011

Это может сработать для вас:

sed ':a;N;s/ \(\S*\)\n\(\S*\) /+\2 \1+/;$!ba;s/ /\n/p;d' file | bc | paste -sd' '

или

echo $(cut -d' ' -f1 file | paste -sd+ | bc) $(cut -d' ' -f2 file| paste -sd+ |bc)
0 голосов
/ 01 декабря 2011

Вот альтернатива без awk для вас:

echo $( cut -f 1 -d " " log_file | tr '\n' + | xargs -I '{}' echo '{}'0 | bc ) $( cut -f 2 -d " " log_file | tr '\n' + | xargs -I '{}' echo '{}'0 | bc )

Убедитесь, что вы замените log_file своим собственным файлом, и в этом файле нет лишних или ненужных новых строк. Если у вас есть такие строки, нам нужно отфильтровать их, используя следующую команду:

grep -v "^\s*$" log_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...