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

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

У меня есть большой текстовый файл с показаниями, как показано ниже,

name=ABC
class=3
age=7
roll_no=41 

name=XYZ
class=4
age=9
roll_no=23 

Итак, как мне разделить каждое nameиз них ageи записать результат в одну строку, значения разделяются пробелом, вот так:

ABC 3
XYZ 9

Есть ли какой-либо инструмент/скрипт для сохранения результата в JSONформате ?

Пробовал часами работать с awk, sed, и т.д. и т.п., но я ужасен в обработке текста в командной строке, заранее спасибо tr.grep

решение1

Я бы использовал awk:

awk -F"=" '
    {data[$1] = $2} 
    function output() {
        if ("name" in data && "age" in data) 
            print data["name"], data["age"]
        delete data
    }
    NF == 0 {output()} 
    END     {output()}
' filename

решение2

Если perlдоступно, фрагменты текста, разделенные одной или несколькими пустыми строками, идеально подходят для обработки в perlрежиме абзаца:

perl -n00e ' # Read the input file paragraph-by-paragraph
  # Split each paragraph into lines and join the lines with an = sign:
  $s = join "=",split /\n/;
  # Split the joined fields on = signs (with possible blanks around them):
  %h = split /\s*=\s*/,$s;
  print "$h{name} $h{age}\n" # Print the required information
' your_file

В приведенном выше коде ваш файл анализируется в хэш-структуру ( %h), где ключи — это имена полей (слева от знаков =), а значения — это значения полей (справа от знаков =) в каждой строке. После того, как абзац был проанализирован в эту структуру, мы выводим значения полей «имя» и «возраст».

решение3

Вы можете использовать следующую команду:

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'

это даст вывод вроде:

ABC 7
XYZ 9

РЕДАКТИРОВАТЬ:

Ниже команда выдаст строку, содержащую строку nameилиage

grep -E "name|age" filename

name=ABC
age=7
name=XYZ
age=9

Эта команда создаст одну строку из двух строк.

grep -E "name|age" filename | sed 'N;s/\n/ /'
name=ABC age=7
name=XYZ age=9

Приведенная ниже команда удалит знак равенства = из вывода.

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'
name ABC age 7
name XYZ age 9

Ниже команда, печатающая ваши требования

grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
ABC 7
XYZ 9

awkпечать 2-го и 4-го аргументов вывода предыдущей команды

все же вы сталкиваетесь с какими-либо проблемами в понимании любого синтаксиса, Google может объяснить это подробно :).

решение4

Так как вы просили другой язык. Вотодинспособ сделать это в Python, сохранив входные данные в словаре, чтобы можно было легко получить доступ к значениям с помощью ключей nameи age:

#!/usr/bin/env python3

myDict = {}

with open("ages") as inFile:
    for line in inFile:
       if line == "\n":
            print(myDict['name'].rstrip() + " " + myDict['age'], end="")
            continue
       (key, value) = line.split("=")
       myDict[key] = value

print(myDict['name'].rstrip() + " " + myDict['age'], end="")

Учитывая этот входной файл ( ages):

name=ABC
class=3
age=7
roll_no=41

name=XYZ
class=4
age=9
roll_no=23

Я получаю такой результат:

./pyAges.py 
ABC 7
XYZ 9

Связанный контент