У меня есть два столбца в файле, и я хочу автоматизировать суммирование обоих значений в строке

Например

read write
5    6
read write
10   2
read write
23   44

Затем я хочу просуммировать «прочитанное» и «записанное» каждой строки. В конце концов, после суммирования я нахожу максимальную сумму и помещаю это максимальное значение в файл. Я чувствую, что мне нужно использовать grep -v, чтобы избавиться от заголовков столбцов в каждой строке, что, как указано в ответах, делает код неэффективным, поскольку я использую весь файл только для чтения строки.

В настоящее время у меня есть это в сценарии bash (в цикле for, где $ x - имя файла), чтобы суммировать столбцы по строкам

lines=`grep -v READ $x|wc -l | awk '{print $1}'`
line_num=1
arr_num=0


while [ $line_num -le $lines ]
do

    arr[$arr_num]=`grep -v READ $x |  sed $line_num'q;d' | awk '{print $2 + $3}'`
    echo $line_num
    line_num=$[$line_num+1]
    arr_num=$[$arr_num+1]

done

Однако в суммируемом файле содержится более 270 000 строк. Сценарий работает уже несколько часов, и он еще далек от завершения. Есть ли более эффективный способ написать это, чтобы это не заняло так много времени?

6
Emil 26 Мар 2014 в 22:10
Немного неортодоксально .. импортировать в базу данных и SUM оттуда?
 – 
SamV
26 Мар 2014 в 22:13
Непонятно, что за зависание с READ; Я подозреваю, что вы не рассказываете нам всю историю о формате входных данных.
 – 
Jonathan Leffler
26 Мар 2014 в 22:21
1
Ваш скрипт читает весь файл, чтобы извлечь одну строку для каждой строки. Неудивительно, что это занимает много времени.
 – 
tripleee
26 Мар 2014 в 22:21
1
Вызов grep, sed и awk для каждой итерации цикла while, вероятно, является основной причиной вашей проблемы с производительностью. Особенно учитывая, что grep эффективно читает весь файл на каждой итерации.
 – 
Digital Trauma
26 Мар 2014 в 22:39
Вам нужно знать номер строки? Какой именно формат вывода вы хотите?
 – 
Sammitch
27 Мар 2014 в 00:02

6 ответов

Лучший ответ

Вместо этого используйте и воспользуйтесь преимуществом модуля функция:

awk '!(NR%2){print $1+$2}' infile
6
Juan Diego Godoy Robles 24 Окт 2018 в 18:31
Я изменил формат исходного файла в своем вопросе, так как это актуально. Я забыл упомянуть об этом. Вот почему я должен использовать grep
 – 
Emil
26 Мар 2014 в 22:48