Eu tenho um arquivo de texto grande com leituras como abaixo,
name=ABC
class=3
age=7
roll_no=41
name=XYZ
class=4
age=9
roll_no=23
Então, como posso separar cada um name
com seus respectivos age
e escrever o resultado em uma única linha, valores separados por espaço, assim
ABC 3
XYZ 9
Existe alguma ferramenta/script para salvar o resultado no JSON
formato?
Tentei horas com awk
, sed
, tr
, grep
etc., mas sou péssimo no processamento de texto de linha de comando, desde já agradeço.
Responder1
Eu usaria 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
Responder2
Se perl
estiver disponível, pedaços de texto separados por uma ou mais linhas em branco são perfeitos para processamento com perl
o modo de parágrafo de:
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
Acima, o código analisa seu arquivo na estrutura hash ( %h
) onde as chaves são os nomes dos campos (à esquerda dos =
sinais) e os valores são os valores dos campos (à direita dos =
sinais) em cada linha. Depois que o parágrafo for analisado nesta estrutura, imprimimos os valores dos campos “nome” e “idade”.
Responder3
Você pode usar o comando abaixo:
grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
ele dará uma saída como:
ABC 7
XYZ 9
EDITAR:
O comando abaixo fornecerá uma linha que possui string name
ouage
grep -E "name|age" filename
name=ABC
age=7
name=XYZ
age=9
Este comando fará uma linha de duas linhas
grep -E "name|age" filename | sed 'N;s/\n/ /'
name=ABC age=7
name=XYZ age=9
O comando abaixo removerá o sinal de igual = da saída
grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'
name ABC age 7
name XYZ age 9
Abaixo do comando imprimindo seu requisito
grep -E "name|age" filename | sed 'N;s/\n/ /' | sed 's/[=,]/ /g'| awk '{ print $2, $4}'
ABC 7
XYZ 9
awk
imprimindo o 2º e o 4º argumento da saída do comando anterior
ainda assim você está enfrentando algum problema para entender qualquer sintaxe que o Google possa explicar em profundidade :).
Responder4
Já que você pediu outro idioma. Aqui estáummaneira de fazer isso em Python, salvando a entrada em um dicionário para que você possa acessar facilmente os valores com as chaves name
e 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 arquivo ( ages
):
name=ABC
class=3
age=7
roll_no=41
name=XYZ
class=4
age=9
roll_no=23
Eu obtenho este resultado:
./pyAges.py
ABC 7
XYZ 9