Как вычислить значение каждой строки с помощью команды awk

Вопрос или проблема

У меня есть файл расчета заработной платы

Payroll File

Можете помочь мне вычислить значение для каждой строки, используя команду awk, для каждого значения в строке -10 ?
Result

Я могу вычислить только первую строку с этой командой:

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

Объяснения и разбор

  1. for (i=2;i<=NF;i++): Этот цикл проходит по всем полям строки (начиная со второго, так как первое предполагается, что это имя сотрудника), определяя количество рабочих или иных числовых данных.

  2. sum[$1]+=$i-10: Здесь мы используем массив sum для хранения накопленной суммы для каждого элемента $1 (имени сотрудника). $i-10 означает, что из каждого значения в строке вычитается 10, а затем добавляется к текущему суммарному значению для этого сотрудника.

  3. 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-среде.

Оцените материал
Добавить комментарий

Капча загружается...