Как вычесть 2 числа в 2 разных файлах? - PullRequest
4 голосов
/ 25 октября 2019

У меня есть 2 файла, которые являются отчетами о размере баз данных (1 файл со вчерашнего дня, 1 с сегодняшнего дня). Я хочу посмотреть, как изменился размер каждой базы данных, поэтому я хочу рассчитать разницу.

Файл выглядит так:

"DATABASE","Alloc MB","Use MB","Free MB","Temp MB","Hostname"

"EUROPE","9133508","8336089","797419","896120","server3"
"ASIA","3740156","3170088","570068","354000","server5"
"AFRICA","4871331","4101711","769620","318412","server4"

Другие файлы такие же, только цифрыотличается.

Я хочу посмотреть, как изменился размер базы данных (поэтому ТОЛЬКО столбец «Использовать МБ» ).

Я думаю, я не могу использовать «diff» или «awk»"варианты, так как числа могут резко меняться каждый день. Единственный хороший «алгоритм», который я могу придумать, - это вычитать числа между 5-й и 6-й двойной кавычкой ("), как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Может быть, я что-то упустил, но я не понимаю, почему вы не можете использовать awk, поскольку он может полностью

Единственный хороший «алгоритм», который я могу придумать, - это вычитать числамежду 5-й и 6-й двойной кавычкой ("), как мне это сделать?

Допустим, что file1 это:

"DATABASE","Alloc MB","Use MB","Free MB","Temp MB","Hostname"

"EUROPE","9133508","8336089","797419","896120","server3"
"ASIA","3740156","3170088","570068","354000","server5"
"AFRICA","4871331","4101711","769620","318412","server4"

И file2 это:

"DATABASE","Alloc MB","Use MB","Free MB","Temp MB","Hostname"

"EUROPE","9133508","8335089","797419","896120","server3"
"ASIA","3740156","3170058","570068","354000","server5"
"AFRICA","4871331","4001711","769620","318412","server4"

Команда

awk -F'[",]' 'NR>2&&NR==FNR{db[$2]=$8;next}FNR>2{print $2, db[$2]-$8}' file1 file2

дает вам результат:

EUROPE 1000
ASIA 30
AFRICA 100000

Вы также можете использовать этот ответ для более правильной работы с кавычками в awk.


Если ваша версия awk не поддерживает несколько разделителей полей, вы можете попробовать это:

awk -F, 'NR>2&&NR==FNR{db[$1]=$3;next}FNR>2{print $1, db[$1]-$3}' <(sed 's,",,g' file1) <(sed 's,",,g' file2)
3 голосов
/ 25 октября 2019

Вы можете сделать это (используя awk):

paste file1 file2 -d ',' |awk -F ',' '{gsub(/"/, "", $3); gsub(/"/, "", $9); print $3 - $9}'

paste помещает два файла рядом друг с другом, разделенные запятой (-d ','). Таким образом, у вас будет:

"DATABASE","Alloc MB","Use MB","Free MB","Temp MB","Hostname","DATABASE","Alloc MB","Use MB","Free MB","Temp MB","Hostname"

"EUROPE","9133508","8336089","797419","896120","server3","EUROPE","9133508","8336089","797419","896120","server3"
...

gsub(/"/, "", $3) удаляет кавычки вокруг столбца 3

И, наконец, мы печатаем столбец 3 минус столбец 9

...