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 name
con su respectivo age
y 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 JSON
formato?
Intenté horas con awk
, sed
, tr
, grep
etc., 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 perl
está disponible, los fragmentos de texto separados por una o más líneas en blanco son perfectos para procesar con perl
el 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 name
oage
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
awk
imprimiendo 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 name
y 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