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 name
durch ihre jeweiligen Werte trennen age
und 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 JSON
Format zu speichern?
Habe es stundenlang mit awk
, sed
, tr
, grep
usw. 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 perl
verfügbar, eignen sich Textblöcke, die durch eine oder mehrere Leerzeilen getrennt sind, perfekt für die Verarbeitung im perl
Absatzmodus 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 name
oderage
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
awk
Drucken 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 name
und 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