Trennen Sie zwei Werte aus einem großen Text, während jeder Messwert durch eine Leerzeile getrennt ist

Trennen Sie zwei Werte aus einem großen Text, während jeder Messwert durch eine Leerzeile getrennt ist

Ich habe eine große Textdatei mit Angaben wie unten,

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

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

Wie kann ich also die einzelnen Werte namedurch ihre jeweiligen Werte trennen ageund das Ergebnis in einer einzigen Zeile schreiben, wobei die Werte durch ein Leerzeichen getrennt sind, etwa so:

ABC 3
XYZ 9

Gibt es ein Tool/Skript, um das Ergebnis im JSONFormat zu speichern?

Habe es stundenlang mit awk, sed, tr, grepusw. usw. probiert, aber ich bin schrecklich bei der Textverarbeitung über die Befehlszeile. Danke im Voraus.

Antwort1

Ich würde awk verwenden:

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

Antwort2

Wenn perlverfügbar, eignen sich Textblöcke, die durch eine oder mehrere Leerzeilen getrennt sind, perfekt für die Verarbeitung im perlAbsatzmodus von :

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

Im obigen Code analysiert der Code Ihre Datei in die Hash-Struktur ( %h), wobei die Schlüssel die Feldnamen (links von den =Zeichen) und die Werte die Feldwerte (rechts von den =Zeichen) in jeder Zeile sind. Sobald der Absatz in diese Struktur analysiert wurde, drucken wir die Werte der Felder „Name“ und „Alter“ aus.

Antwort3

Sie können den folgenden Befehl verwenden:

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

Es wird eine Ausgabe wie die folgende ausgegeben:

ABC 7
XYZ 9

BEARBEITEN:

Der folgende Befehl gibt eine Zeile mit einer Zeichenfolge nameoderage

grep -E "name|age" filename

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

Dieser Befehl macht aus zwei Zeilen eine Zeile

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

Der folgende Befehl entfernt das Gleichheitszeichen = aus der Ausgabe

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

Unter dem Befehl wird Ihr Bedarf gedruckt

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

awkDrucken des 2. und 4. Arguments der vorherigen Befehlsausgabe

Sie haben immer noch Probleme, die Syntax zu verstehen? Google erklärt sie möglicherweise ausführlich :).

Antwort4

Da Sie nach einer anderen Sprache gefragt haben. Hier isteinsMöglichkeit, dies in Python zu tun, indem die Eingabe in einem Wörterbuch gespeichert wird, sodass Sie mit den Schlüsseln nameund einfach auf die Werte zugreifen können 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="")

Angesichts dieser Indatei ( ages):

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

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

Ich erhalte dieses Ergebnis:

./pyAges.py 
ABC 7
XYZ 9

verwandte Informationen