Отображение значений из одного файла в другой с помощью Bash - PullRequest
1 голос
/ 18 марта 2020

Итак, у меня есть два файла, а именно, перечисленные ниже, я только что добавил 2 примера, однако у меня есть почти 100 строк в файле file1 в формате, указанном ниже.

Идея в том, что используются переменные файла file2 в качестве источника одного из наших внутренних сценариев, в данный момент мы вручную заполняем данные из файла file1 в файл file2, поскольку мы вручную отображаем значения.

Я хотел бы знать, можно ли этого достичь с помощью Bash создание сценариев для определения ключевых слов файла1 и сопоставления их с ключевыми словами файла2 и добавления значений этих соответствующих ключевых слов файла1 в соответствующие ключи файла 2.

Файл 1

system-service:10/AF/GH/100-2020
mint-value-daemon:10/GH/KL-19GA1-2020
event-count-svc:10/LL/GH/LL-2020
node-daemon:ABCD_201612_1900_139

Файл 2

MINT_SERVICE=10/GH/KL-19GA1-2020 //value2 from file1
SYSTEM_SERVICE=10/AF/GH/100-2020 //Value1 from file1
EVENT_SERVICE=svc:10/LL/GH/LL-2020 //value3 from file1
NODE_SERVER_TAG=ABCD_201612_1900_139 //value 4 from file1

ПРИМЕЧАНИЕ: Просто наперед ключевые слова в файле1 - это обычно 2-3 слова с переносами, поэтому я подумал о частичном совпадении ключевых слов, таких как событие от файла2 до события из file1 и получите соответствующее значение.

1 Ответ

0 голосов
/ 18 марта 2020

Если file2 необходимо создать с нуля:

awk -F: -v OFS='=' '{
    split($1, a, "-")
    print toupper(a[1])"_SERVICE", $2
}' file1 > file2

Если file2 уже содержит переменные, которые необходимо перезаписать:

#! /usr/bin/env bash
awk -F: -v OFS='=' '{
    if (FNR == NR) {
        split($1, a, "-")
        var[toupper(a[1])] = $2
    } else {
        split($0, a, "=")
        split(a[1], b, "_")
        if (var[b[1]] != "") {
            print a[1], var[b[1]]
        } else {
            print
        }
    }
}' file1 file2 > file2_new

mv file2_new file2

Второе объяснение фрагмента:

1) awk перебирает входные файлы построчно.
2) При этом $ 0 содержит значение полной строки. $ 1, $ 2, $ 3… содержат отдельные значения : с разделителями. Мы попросили : быть разделителем в arg -F:.
3) NR - это переменная, содержащая номер строки, в которой она находится в данный момент.
4) Поскольку мы вводим 2 файла в awk, это немного отличается NR сбрасывается в 0, когда мы go переходим к следующему файлу. FNR - это переменная, которая будет увеличиваться независимо от файла, через который она проходит.
5) Условная проверка FNR == NR означает, что мы находимся на первом файле.

Взяв пример из файла file1, давайте скажем, мы были на линии

mint-value-daemon:10/GH/KL-19GA1-2020
$0 = mint-value-daemon:10/GH/KL-19GA1-2020
$1 = mint-value-daemon
$2 = 10/GH/KL-19GA1-2020


6) В этом условном выражении мы используем функцию split () для разделения $ 1 на - в массив с именем a.

Таким образом, в основном эта строка:

split($1, a, "-")

дает нам:

a[1] = mint
a[2] = value
a[3] = daemon

Мы используем ассоциативный массив, названный var.

var[toupper(a[1])] = $2

Здесь хранится значение $2 в ключе MINT, т. Е.

var["MINT"] = 10/GH/KL-19GA1-2020

При этом сохраняется значение каждого такого элемента в file1.

Когда условие FNR == NR становится ложным, т. е. мы начинаем обход второго файла, мы используем аналогичный подход.

Помните, что разделитель файлов по-прежнему :, и он не является разделителем в файле 2.

Так что в другом случае :

Допустим, мы были в сети:

MINT_SERVICE=10/GH/KL-19GA1-2020 //value2 from file1

Мы используем:

split($0, a, "=")

Что дает нам:

a[1] = MINT_SERVICE
a[2] = 10/GH/KL-19GA1-2020 //value2 from file1

Затем на a[1] мы снова используем разбиение на основе _.

split(a[1], b, "_")

Это дает нам:

b[1] = MINT
b[2] = SERVICE

Теперь:

if (var[b[1]] != "") {
    print a[1], var[b[1]]
} else {
    print
}

В массиве var, в котором мы сохранили значения, когда FNR == NR было истинно,

Мы проверяем, если

var["MINT"] != ""

, если это верно,

print a[1], var[b[1]] 

который печатает:

MINT_SERVICE=10/GH/KL-19GA1-2020

Причиной = является -v OFS='=', который является разделителем print.

в остальном:

print

, что совпадает с

print $0

, т. Е. Если это значение, а не ключ в var, напечатайте его без каких-либо изменений.


Все эти выходные данные отправляются на file2_new .

В конце мы переименовываем file2_new в file2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...