Поиск…


Надежная обработка табличных данных (CSV и др.)

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

  • необязательные имена столбцов в первой строке
  • смесь значений котируемых и некотируемых столбцов
  • различные разделители
  • локализованные форматы для плавающих чисел

Хотя определенно можно обрабатывать все эти функции чисто и в целом с помощью awk, это, вероятно, не стоит усилий.

Обмен двумя столбцами в табличных данных

При использовании файла ; как разделитель столбцов. Перенос первого и второго столбцов осуществляется

awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'

Вычислить среднее значение значений в столбце из табличных данных

При использовании файла ; как разделитель столбцов. Мы вычисляем среднее значение значений во втором столбце со следующей программой, предоставленный вход представляет собой список классов студенческой группы:

awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF

Результат этой программы - 2.125 .

Помните, что NR содержит номер обрабатываемой линии, в блоке END он удерживает общее количество строк в файле.

Помните, что во многих приложениях (мониторинг, статистика) медиана является гораздо более полезной информацией. См. Соответствующий пример.

Выбор определенных столбцов в табличных данных

Мы предполагаем использование файла; как разделитель столбцов. Для выбора определенного набора столбцов требуется только оператор печати . Например, следующая программа выбирает столбцы 3, 4 и 7 из своего ввода:

awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'

Как обычно, можно более тщательно выбирать строки для печати. Следующая программа выбирает столбцы 3, 4 и 7 из своего ввода, когда первое поле - это Alice или Bob :

awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'

Вычислить медиану значений в столбце из табличных данных

При использовании файла ; как разделитель столбцов. Мы вычисляем медиану значений во втором столбце со следующей программой, написанной для GNU awk . Предоставленный вход - это список классов студенческой группы:

gawk -F';' '{ sample[NR] = $2 }
 END {
   asort(sample);
   if(NR % 2 == 1) {
     print(sample[int(NR/2) + 1])
   } else {
     print(sample[NR/2])
   }
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF

Результат этой программы: 1 .

Помните, что NR содержит номер обрабатываемой линии, в блоке END он удерживает общее количество строк в файле.

Многие реализации awk не имеют функции для сортировки массивов, поэтому их необходимо определить до того, как будет использован код выше.

Выбор набора линий между двумя шаблонами

Сравнение шаблонов может эффективно использоваться с awk поскольку оно контролирует действия, которые следуют за ним, т.е. { pattern } { action } . Одним из интересных применений сопоставления шаблонов является выбор нескольких между двумя шаблонами в файле say patternA и patternB

$ awk '/patternA/,/patternB/' file

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

$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6

$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB

Вышеупомянутая команда не выполняет никаких конкретных { action } кроме как для печати строк, но любые конкретные действия в подмножестве строк могут применяться с помощью блока действий ( {} ).



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow