Скрипт оболочки для денормализации данных

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

Ищем команду для денормализации данных с следующими требованиями…

Входные данные:

key1|desc field|item1|extra field
key1|desc field|item2|extra field
key1|desc field|item3|extra field
key1|desc field|item4|extra field
key2|desc field|item1|extra field
key2|desc field|item2|extra field
key2|desc field|item3|extra field

Выходные данные:

key1|desc field|item1,item2,item3,item4|extra field
key2|desc field|item1,item2,item3|extra field

Разделители и позиции полей могут варьироваться в зависимости от файла, поэтому необходимо использовать более параметризованный подход…

Ответ или решение

Скрипт оболочки для денормализации данных

Введение

В этой статье мы рассмотрим, как создать скрипт на Shell для денормализации данных в формате, который указан в вашем вопросе. Денормализация предполагает объединение нескольких строк данных с идентичными ключами в одну строку. Мы также обеспечим параметризацию скрипта, чтобы сделать его гибким, учитывающим различные разделители и порядок полей.

Задача

Данные на входе выглядят следующим образом:

key1|desc field|item1|extra field
key1|desc field|item2|extra field
key1|desc field|item3|extra field
key1|desc field|item4|extra field
key2|desc field|item1|extra field
key2|desc field|item2|extra field
key2|desc field|item3|extra field

Необходимо преобразовать их в выходной формат:

key1|desc field|item1,item2,item3,item4|extra field
key2|desc field|item1,item2,item3|extra field

Подход к решению

Мы будем использовать утилиты awk, sort и uniq, чтобы эффективно обработать данные. Скрипт будет принимать в качестве параметров разделитель, например |, и индекс полей, которые необходимо объединить.

Пример скрипта

Вот пример реализация скрипта на Shell:

#!/bin/bash

# Проверка правильности аргументов
if [ "$#" -ne 3 ]; then
    echo "Использование: $0 <файл_входа> <разделитель> <индекс_уникального_ключа>"
    exit 1
fi

input_file="$1"
separator="$2"
unique_key_index="$3"

# Обработка данных
awk -F"$separator" -v OFS="$separator" -v key_index="$unique_key_index" '
{
    key = $key_index
    desc = $2      # Вторая колонка
    extra = $NF    # Последняя колонка
    items[key][desc][extra] = (items[key][desc][extra] ? items[key][desc][extra] "," : "") $3
}
END {
    for (k in items) {
        for (d in items[k]) {
            for (e in items[k][d]) {
                print k, d, items[k][d][e], e
            }
        }
    }
}' "$input_file" > output.txt

echo "Данные денормализованы и записаны в output.txt."

Объяснение работы скрипта

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

  2. Использование awk:

    • -F"$separator" задает разделитель для входных данных.
    • -v OFS="$separator" позволяет установить тот же разделитель для выходных данных.
    • Скрипт формирует структуру данных, где ключи объединяются, а элементы по каждому ключу собираются в виде списка.
  3. Вывод данных: В конце мы используем цикл, чтобы вывести все собранные данные в формате, который указан в задаче.

Заключение

Данный скрипт позволяет эффективно денормализовать данные с учетом различных форматов и требований. Вы можете расширить функциональность скрипта, добавить дополнительные уровни параметризации или обработку ошибок в зависимости от ваших потребностей. Этим способом мы достигаем надежного и универсального решения для работы с текстовыми данными.

Если у вас возникли вопросы или найдены ошибки, обязательно оставляйте комментарии для улучшения работы скрипта!

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

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