Separe dos valores de un texto grande, mientras cada una de las lecturas está separada por una línea en blanco

Separe dos valores de un texto grande, mientras cada una de las lecturas está separada por una línea en blanco

Tengo un archivo de texto grande con lecturas como las siguientes,

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

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

Entonces, ¿cómo puedo separar cada uno namecon su respectivo agey escribir el resultado en una sola línea, valores separados por un espacio, así?

ABC 3
XYZ 9

¿Existe alguna herramienta/script para guardar el resultado en JSONformato?

Intenté horas con awk, sed, tr, grepetc., etc. pero soy horrible en el procesamiento de texto de la línea de comandos, gracias de antemano.

Respuesta1

Yo usaría 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

Respuesta2

Si perlestá disponible, los fragmentos de texto separados por una o más líneas en blanco son perfectos para procesar con perlel modo de párrafo:

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

En lo anterior, el código analiza su archivo en la estructura hash ( %h) donde las claves son los nombres de los campos (a la izquierda de los =signos) y los valores son los valores de los campos (a la derecha de los =signos) en cada línea. Una vez que el párrafo ha sido analizado en esta estructura, imprimimos los valores de los campos "nombre" y "edad".

Respuesta3

Puede utilizar el siguiente comando:

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

dará un resultado como:

ABC 7
XYZ 9

EDITAR:

El siguiente comando proporcionará una línea que tiene una cadena nameoage

grep -E "name|age" filename

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

Este comando creará una línea de dos líneas.

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

El siguiente comando eliminará el signo igual = de la salida

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

Debajo del comando imprime su requisito

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

awkimprimiendo el segundo y cuarto argumento de la salida del comando anterior

Aún así, tiene problemas para comprender cualquier sintaxis que Google pueda explicar en profundidad :).

Respuesta4

Ya que pediste otro idioma. Aquí estáunoforma de hacerlo en Python, guardando la entrada en un diccionario para que puedas acceder fácilmente a los valores con las claves namey 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="")

Dado este archivo ( ages):

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

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

Obtengo este resultado:

./pyAges.py 
ABC 7
XYZ 9

información relacionada