staging.inyokaproject.org

Zeilen zusammenfügen mit gleicher Nummer am Zeilenende

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

joma1234

Anmeldungsdatum:
2. Juli 2019

Beiträge: Zähle...

Hallo miteinander,

ich habe eine Datei mit folgenden Zeilen:

EBENE z1 1234
EBENE bla bla 1234
EBENE bla bla 4567
EBENE z2 4567
EBENE z3 9999
EBENE bla bla1 9999
EBENE bla2 bla1 9999

Und mein Ziel wäre es, folgenden Output zu generieren:

EBENE z1 1234 EBENE bla bla 1234
EBENE bla bla 4567 EBENE z2 4567
EBENE z3 9999 EBENE bla bla1 9999 EBENE bla2 bla1 9999

Also die Idee ist es all Einträge, die die gleiche Zahl am Zeilenende haben, in eine Zeilen zusammenzufügen. Ein Einzeiler wäre mir am liebsten.

Danke schon mal für die Hilfe.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Mit awk ginge das z.B. so:

$ awk '{(!data[$NF]) ? sep="" : sep=" "; data[$NF]=data[$NF] sep $0} END {for (key in data) { print data[key] }}' test.txt 
EBENE z1 1234 EBENE bla bla 1234
EBENE bla bla 4567 EBENE z2 4567
EBENE z3 9999 EBENE bla bla1 9999 EBENE bla2 bla1 9999 

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

Mal umständlich in Laienversion:

for x in $(cat "INPUTFILE"); do echo -n "$x "; if [ "$x" = "1234" ]; then echo -e '\n'; fi; done

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

joma1234 schrieb:

ich habe eine Datei mit folgenden Zeilen:

EBENE z1 1234
EBENE bla bla 1234
EBENE bla bla 4567
EBENE z2 4567
EBENE z3 9999
EBENE bla bla1 9999
EBENE bla2 bla1 9999

Liegen die gleichen Endziffern immer direkt hintereinander im Block? Das würde einen Ansatz erlauben, der nicht die gesamte Datei im Speicher halten muss:

1
2
3
4
$ awk 'NR == 1 {printf "%s", $0} NR > 1 {printf("%s%s", $NF != last ? "\n" : " ", $0)} {last = $NF} END {print}' data
EBENE z1 1234 EBENE bla bla 1234
EBENE bla bla 4567 EBENE z2 4567
EBENE z3 9999 EBENE bla bla1 9999 EBENE bla2 bla1 9999EBENE bla2 bla1 9999

joma1234

(Themenstarter)

Anmeldungsdatum:
2. Juli 2019

Beiträge: 10

Hi,

dieses Kommando macht genau das was ich wollte. Vielen Danke!

$ awk 'NR == 1 {printf "%s", $0} NR > 1 {printf("%s%s", $NF != last ? "\n" : " ", $0)} {last = $NF} END {print}' data

Aber ich muss gestehen, so wirklich verstehe ich es nicht. Wäre ein Erklärung für Dummies noch drin?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

NR == 1 {printf "%s", $0}

Wenn du in der ersten Zeile der gelesenen Datei bist, gebe alle Felder ohne Zeilenumbruch am Ende aus.

NR > 1 {printf("%s%s", $NF != last ? "\n" : " ", $0)}

Wenn du in einer späteren Zeile als 1 der gelesenen Datei bist: wenn das letzte Feld ($NF) nicht dem Wert der Variablen last entspricht, gebe ein Newline-Zeichen (\n) aus, ansonsten ein Leerzeichen. Danach gebe alle Felder ohne folgenden Zeilenumbruch aus.

{last = $NF}

Setze den Wert der Variablen last auf den Wert des letzten Feldes

END {print}'

Gebe alle Felder der letzten Zeile gefolgt von einem Zeilenumbruch aus.

IMHO tut das aber nicht ganz das, was du willst, weil die letze Zeile zwei mal ohne ein trennendes Leerzeichen angehängt wird (der doppelte Teil ist markiert):

$ awk 'NR == 1 {printf "%s", $0} NR > 1 {printf("%s%s", $NF != last ? "\n" : " ", $0)} {last = $NF} END {print}' data.txt 
EBENE z1 1234 EBENE bla bla 1234
EBENE bla bla 4567 EBENE z2 4567
EBENE z3 9999 EBENE bla bla1 9999 EBENE bla2 bla1 9999EBENE bla2 bla1 9999 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

mit END {printf "%s", "\n"} statt END {print} sollte es klappen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

seahawk1986 schrieb:

Danke für die Erläuterung!

END {print}'

Gebe alle Felder der letzten Zeile gefolgt von einem Zeilenumbruch aus.

Oh, das habe ich übersehen oder falsch aus meinem Terminal kopiert. Ja, das sollte einfach nur END {printf "\n"} sein.

1
2
3
EBENE z1 1234 EBENE bla bla 1234
EBENE bla bla 4567 EBENE z2 4567
EBENE z3 9999 EBENE bla bla1 9999 EBENE bla2 bla1 9999
Antworten |