Если 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
.