Как выбрать конкретные строки на основе сопоставления с шаблоном из файла в другой файл - PullRequest
0 голосов
/ 11 апреля 2019

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

{
    "lotsoftext": [
........
],
  {
        "Key": "Envvi",
        "Value": "model"
  },
  {
        "Key": "Department",
        "Value": "Sys"
  }
  {  
        "Key": "Subdept",
        "Value": "io"
  },
}
....

Я хочу вывод, как в отдельном файле file2 что-то_model-Sys

"Key": "Envvi","Key": "Department" -> остается постоянным во всех файлах, но значение продолжает изменяться,Один раз это может быть Sys, другой раз это может быть Fin и т. Д.Мне просто нужны строки под шаблоном соответствия "Key": "Envvi" и "Key": "Department" ,.В окончательном выводе я добавляю слово «что-то» перед последующим подчеркиванием «_», затем значение в значении дефиса Ennvi в Department.С помощью awk мне удалось что-то удалить, но я не смог найти то, что хотел.Это выглядит слишком сложно для меня.Любая помощь, пожалуйста

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

если данные в файле 'd', от gnu sed,

sed -En '/\s*"Key":\s*"Envvi"|\s*"Key":\s*"Department"/{n;p}' d
0 голосов
/ 11 апреля 2019

Ответ 1:

egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {print tolower($2)}' | sed -e 's/[" ]//g' -e 's/-$/\n/' -e 's/^/aws_/'

Ввод: cat example_1.txt

{
    "Key": "Envvi",
    "Value": "model"
 },
 {
    "Key": "Department",
    "Value": "Sys"
 }
 {
    "Key": "Subdept",
    "Value": "io"
 }

Выход:

something_model-sys

Добавление дополнительного объяснения:

1) egrep -A 1 "Envvi | Department" example_1.txt -> Выполняет поиск необходимых значений ключа и печатает эту строку и одну строку после соответствия (-A 1). Выход этого первого шага будет следующим:

"Key": "Envvi",
"Value": "model"
--
"Key": "Department",
"Value": "Sys"

2) awk -F: -v ORS = "-" '/ Value / {print tolower ($ 2)}' -> Это находит пару значений из предыдущего вывода и печатает 2-е поле, используя ":" как разделитель полей. tolower () используется для вывода нижнего регистра. Ниже приведен результат этого шага. Обратите внимание, что в конце нет новой строки, поскольку ORS установлен на «-».

 "model"- "sys"-

3) sed -e 's / ["] // g' -> Эта часть берет входные данные из предыдущего шага и удаляет любые вхождения двойных кавычек и пробела. Ниже приведены выходные данные после этого шага. Обратите внимание, что до сих пор нет новой строки в конце.

model-sys-

4) 's / - $ / \ n /' -> Эта вторая часть sed берет ввод с предыдущего шага и заменяет последнее вхождение hypen (-) в конце строки новой строкой. Ниже приведен вывод после этого шага. Обратите внимание, что теперь в конце есть новая строка.

model-sys

5) 's / ^ / aws_ /' -> Эта последняя часть sed берет входные данные из предыдущего шага и добавляет строку «aws_» в начало строки.

aws_model-sys

Далее улучшенная / упрощенная версия Ответа 1, которая работает в GNU AWK (с использованием gsub):

egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {gsub(/[" ]/,"",$2); print tolower($2)}' | sed -e 's/-$/\n/' -e 's/^/aws_/' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...