Вопрос или проблема
У меня есть файл расчета заработной платы
Можете помочь мне вычислить значение для каждой строки, используя команду awk, для каждого значения в строке -10 ?
Я могу вычислить только первую строку с этой командой:
awk '{sum += $3*7} END {print sum}' RS= payroll.txt
Выполните:
awk '{for (i=2;i<=NF;i++) sum[$1]+=$i-10} END{for (i in sum) \
print i, "Total =", sum[i]}' file.txt
-
{for (i=2;i<=NF;i++) sum[$1]+=$i-10}
перебирает поля и создает массивsum
с первым полем в качестве ключа, а значения полей, уменьшенные на 10, в качестве значений -
END{for (i in sum) print i, "Total =", sum[i]}
, выводит ключи и значения массива в нужном формате вывода
Пример:
% cat file.txt
employee1 75 75 75 75 75 75 75
employee2 80 80 80 80 80 80 80
employee3 50 50 50 50 50 50 50
% awk '{for (i=2;i<=NF;i++) sum[$1]+=$i-10} END{for (i in sum) print i, "Total =", sum[i]}' file.txt
employee1 Total = 455
employee2 Total = 490
employee3 Total = 280
Большинство систем, имеющих awk, также имеют perl, который довольно сильно пересекается, но для этого случая удобнее. Если у вас он есть и на каждого сотрудника приходится только одна строка, просто
perl -nae '$e=shift @F; $t+=$_-10 for @F; print $e." Total= ".$t.$/' inputfile
Если может быть более одной строки на сотрудника и @heemayl прав, что вы хотите, чтобы они были добавлены к одному общему итогу на сотрудника
perl -nae '$e=shift @F; $t{$e}+=$_-10 for @F;}{print $_." Total= ".$t{$_}.$/ for keys %t' inputfile
awk -F';' '{ tot=0; for (c=2; c<=NF; c++) tot+=$c; print $0 ";" tot}' file.csv
Или даже проще:
awk -F';' '{print $0 ";" $2+$3+$4+$5+$6+$7} file.csv'
.
Ответ или решение
Конечно. Рассмотрим более подробно, как можно использовать команду awk
для вычисления значений для каждой строки в файле, особенно учитывая, что изначально у нас могут быть данные о заработной плате сотрудников в текстовом файле в табличной форме. Рассмотрим также различные методики подхода в зависимости от структуры файла и необходимого результата.
Теория
Awk: Что это и как работает?
Awk — это язык программирования и утилита Unix для обработки текстовых данных в строках и столбцах. Его преимущество заключается в способности обрабатывать текстовые потоки и файлы, выполняя указанные программы для каждой строки ввода. Awk отлично подходит для анализа файлов, потому что он по умолчанию разделяет строки на поля, используя пробелы и табуляции (или заданные символы).
В данной ситуации, задача состоит в вычислении значения для каждой строки текстового файла, представляющего собой, например, данные о сотрудниках и их рабочих часах или других количественных показателях. Чтобы из каждого значения на строке вычесть 10 и затем суммировать, потребуется написать и применять правильный awk-скрипт.
Пример
Исходный файл
Предположим, у нас есть payroll.txt со следующим содержанием:
employee1 75 75 75 75 75 75 75
employee2 80 80 80 80 80 80 80
employee3 50 50 50 50 50 50 50
Пример использования Awk
Попробуем разобраться с командой:
awk '{for (i=2;i<=NF;i++) sum[$1]+=$i-10} END{for (i in sum) print i, "Total =", sum[i]}' payroll.txt
Объяснения и разбор
-
for (i=2;i<=NF;i++)
: Этот цикл проходит по всем полям строки (начиная со второго, так как первое предполагается, что это имя сотрудника), определяя количество рабочих или иных числовых данных. -
sum[$1]+=$i-10
: Здесь мы используем массивsum
для хранения накопленной суммы для каждого элемента$1
(имени сотрудника).$i-10
означает, что из каждого значения в строке вычитается 10, а затем добавляется к текущему суммарному значению для этого сотрудника. -
END{for (i in sum) print i, "Total =", sum[i]}
: Эта часть предназначена для вывода итогов после завершения обработки всех строк файла. Для каждого уникального сотрудника выводится его имя и общий итог.
Применение и вывод
Запустив указанную команду, вы получите следующий результат:
employee1 Total = 455
employee2 Total = 490
employee3 Total = 280
Как видно из результатов, за счет конструкции sum[$1]
происходит суммирование отредактированных рабочих значений (за счет вычитания 10) для каждой строки (первого слова — имени сотрудника).
Дальнейшее использование и альтернативы
Если у вас на системах также установлен Perl, можно использовать приведенные командные конструкции на Perl для такой же задачи. Perl имеет более мощные возможности текстовой обработки и может быть полезным, если требуется более сложная логика обработки данных.
Пример с использованием Perl
Команда на Perl будет выглядеть более лаконично:
perl -nae '$e=shift @F; $t+=$_-10 for @F; print $e." Total= ".$t.$/' payroll.txt
Особенности:
$e=shift @F
извлекает первый элемент массива, который соответствует имени сотрудника.$t+=$_-10 for @F
выполняет аналогичную работу, что и рассмотренный кусок кода на awk, вычитая 10 из каждого значения.- Этот вариант подойдёт в случае, если в каждой строке задействована единичная запись на сотрудника.
Заключение
Использование таких инструментов, как awk и Perl, может значительно упростить обработку и анализ текстовых файлов с данными, особенно когда необходимо выполнять операции с числами в табличной структуре. Awk будет выгодно использовать для однотипных операций и обработки строк текстовых файлов, Perl же может пригодиться для более сложных сценариев.
Это пример, как можно эффективно подойти к обработке и анализу текстовой информации в UNIX-подобных системах, что существенно повысит производительность и точность обработки данных в IT-среде.