Aus einer Liste eine Spalte machen???

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reuniger
Beiträge: 47
Registriert: 11.08.2016 11:01:05

Aus einer Liste eine Spalte machen???

Beitrag von reuniger » 26.10.2016 13:50:09

Hallo, wie mache ich aus einer Liste:

"Headline1" | "Text1"
"Headline2" | "Text2"
"Headline3" | "Text3"

eine Spalte:
Headline1 Headline2 Headline3
Text1 Text2 Text3

gerne auch mit Linien zur besseren Lesbarkeit.

Hat jemand einen Tip? :THX:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Aus einer Liste eine Spalte machen???

Beitrag von Meillo » 26.10.2016 14:37:59

So vielleicht (ziemlich zusammengehackt):

Code: Alles auswählen

cut -d\| -f 1 liste | xargs
cut -d\| -f 2 liste | xargs 
... anschliessend vielleicht noch in der Gesamtheit durch `column -t' gepiped.
Use ed once in a while!

maroc

Re: Aus einer Liste eine Spalte machen???

Beitrag von maroc » 26.10.2016 15:10:20

Oder vielleicht so:

Code: Alles auswählen

$ for i in {1..3}; do cat liste | cut -d'|' -f$i | paste -s; done | column -t
Headline1  Headline2  Headline3
Text1      Text2      Text3
$

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Aus einer Liste eine Spalte machen???

Beitrag von Meillo » 26.10.2016 15:45:06

Wenn man `xargs' statt `paste -s' verwendet, dann werden die Quotes auf magische Weise entfernt. ;-)
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus einer Liste eine Spalte machen???

Beitrag von heisenberg » 26.10.2016 19:34:00

Code: Alles auswählen

#!/usr/bin/perl -n
(@{$a[$#a+1]})=split /\|/;           # split+read all lines into 2-dimensional array
END { 
   for($o=0;$o<=$#{$a[0]};$o++) { 
      foreach $i (@a) { 
         $_=@$i[$o];                 # get current element of 2-dimensional array
         s/^\s+|\s+$//g;             # trim
         s/"//g;                     # remove quotes
         printf("%-20s",$_);         # format
      } 
  print "\n";} 
}
datei.txt

Code: Alles auswählen

"Headline1" | "Text1" | "Text11"
"Headline2" | "Text2" | "Text21"
"Headline3" | "Text3" | "Text31"
"Headline4" | "Text4" | "Text41"

Code: Alles auswählen

perl script.pl <datei.txt
Headline1           Headline2           Headline3           Headline4           
Text1               Text2               Text3               Text4               
Text11              Text21              Text31              Text41  
Zuletzt geändert von heisenberg am 27.10.2016 15:43:51, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Korodny
Beiträge: 704
Registriert: 09.09.2014 18:33:22
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Aus einer Liste eine Spalte machen???

Beitrag von Korodny » 26.10.2016 23:38:35

reuniger hat geschrieben:Hallo, wie mache ich aus einer Liste: [...] eine Spalte
Tabellenkalkulationen können so etwas, das nennt sich "transponieren" - die LibreOffice-Hilfe erklärt dir wie das in LibreOffice geht.

Um deine Liste in die Tabellenkalkulation zu bekommen, lade sie in einen Texteditor und ersetze dort die "|" durch TABs. Dann kannst du sie per Kopieren->Einfügen in LO Calc einfügen.

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus einer Liste eine Spalte machen???

Beitrag von r4pt0r » 27.10.2016 15:11:34

quick & dirty mit etwas unschönem awk (fast so schön unlesbar wie das perl-Beispiel von heisenberg :wink: )

Code: Alles auswählen

$ cat datei.txt | tr -d "|" | awk ' { 
  for (c = 1; c <= NF; c++)
  a[NR, c] = $c
}
NF > nf { nf = NF }
END {
  for (c = 1; c <= nf; c++)
    for (r = 1; r <= NR; r++)
      printf ("%15s", a[r, c] (r==NR ? RS : FS))
}'

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus einer Liste eine Spalte machen???

Beitrag von heisenberg » 27.10.2016 17:07:51

Kann ich gar nicht nachvollziehen. Das ist doch alles völlig selbsterklärend. :D Für den Fall das nicht:

@{$a[$#a+1]}

Schreibe das, was da von rechts kommt bitte hinter die letzte Stelle des evtl. noch nicht existierenden Arrays a. Dabei caste den Inhalt des noch nicht existierenden Array-Elementes bitte als Array, damit der von rechts kommende Wert doch bitte im Listenkontext ausgewertet wird.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Aus einer Liste eine Spalte machen???

Beitrag von Meillo » 27.10.2016 20:40:54

Wie schoen, dass der Unix-Tool-Ansatz nicht nur lesbarer sondern auch noch kuerzer ist! :-P

Solange niemand eine *kuerzere* Perl-Loesung anbietet, fehlt mir jegliches Interesse, mir die Muehe zu machen, das Gewirr verstehen zu wollen.
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus einer Liste eine Spalte machen???

Beitrag von heisenberg » 27.10.2016 21:37:04

Solange niemand eine *kuerzere* Perl-Loesung anbietet, fehlt mir jegliches Interesse, mir die Muehe zu machen, das Gewirr verstehen zu wollen.
Für die tägliche manuelle Arbeit auf der Konsole mache ich das auch meist mit Tools. Womit ich aber gerade experimentiere, das ist der Einsatz von Perl als besserer awk/sed-Ersatz - wie auch in diesem Thread wieder. Es kann einfach viel mehr als man denkt. Alleine der evaluated Regex-Replace(/(search)/function($1)/e;) ist es Wert statt awk/sed lieber Perl zu verwenden.

Wenn es allerdings darum geht etwas Dauerhaftes zu haben, dann sind mir da schon Effizienz(Der Shellschnipsel erzeugt mal eben so 10 Prozesse und liest dazu auch noch 3 Mal die Eingabedatei. Das Perl-Script ist 1 Prozess.) und Flexibilität(Der Shellschnipsel ist fix auf 3 Felder/Zeilen festgelegt) wichtiger. Perl als Programmiersprache finde ich beim besten Willen nicht hübsch und für grössere Programme verwende ich es kaum. Ich finde es auch immer wieder faszinierend ganz kleine hocheffiziente Codestücke von AWK/Perl-Spezialisten zu sehen, bei denen man sich dann so manches abgucken kann. Auf dem Level bin ich selbst aber noch nicht.

Hintergrund ist bei mir auch die Entwicklung von Monitoring-Plugins, die jede Minute ausgeführt werden. Im Hinblick auf eine Virtualisierung, die immer mehr Software in weniger Hardware packt, kann ich mir mit verfielfältigter Code-Ineffizienz natürlich auch den gesparten Overhead schlanker werdender Virtualisierung schnell wieder zu Nichte machen.

Just my 2 cents.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Aus einer Liste eine Spalte machen???

Beitrag von r4pt0r » 28.10.2016 10:51:36

Der Ansatz von maroc wäre wohl ziemlich genau auch meiner gewesen wenns um ein einmaliges fire&forget geht. Zwar wird die Datei in jedem Durchlauf neu gelesen, aber warum soll sich der Mensch länger für eine andere Lösung verrenken, wenn der Computer die Mehrarbeit in nem winzigen Bruchteil dieser Zeit packt?

Ich habe auch schon csv-Datensätze mit mehreren tausend Zeilen durch ein Gewirr aus schleifen und pipes gejagt - für einmalige Umwandlungen oder filter ist das mehr als schnell genug wenn ich mich <1min mit überlegen und Tippen beschäftigen muss und dann die eigentliche Arbeit fortsetzen kann.

Für öfter auftretende Aufgaben schreibe ich viele tools auch mit perl - wenn man sich etwas zusammenreißt ist Perl sogar wesentlich besser und vor allem eindeutiger lesbar als z.B. python. Für Komplexe Aufgaben mit viel Verarbeitung von extrem großen Mengen Text kommt eigentlich nur C an Perl vorbei - mit einem vielfachen an Code, der weniger Menschenlesbar ist und in den ich mich Monate später erst wieder über (hoffentlich vorhandene) Kommentare reindenken muss (vor allem weil ich C praktisch nur noch für Atmel AVR nutze). Für fast alle Tools die über ein paar Zeilen shell hinausgehen, kommt bei mir Perl zum Einsatz - oft auch nur um Standardtools miteinander zu kombinieren und deren Ausgaben zu verarbeiten.
Perl lässt sich auch erstaunlich gut mit funktionaler Programmierung kombinieren und damit enorm verkürzen bei gleichzeitig besserer Lesbarkeit - Scala sieht dann im Vergleich wie unbeholfenes Perl mit verkrüppelter syntaktik aus :wink: (@heisenberg: wenn du ein Exemplar von "Higher order Perl" bekommen kannst schlag zu - selbst nach sämtlichen Kamel/LLama-Büchern von O'Reilly ist das eine echte Offenbarung!)

Wenns um reine Textverarbeitung geht ist mir awk aber trotzdem oft lieber. Das Programmiermodell ist wunderbar schlank, klar definiert und ohne die vielen spezialisierungen und grenzfälle "moderner" Scriptsprachen, sodass es mit einem kompakten und strukturierten Befehlssatz extrem anpassungsfähig und universell ist. Ich kann jedem nur empfehlen mal "The AWK programming language" zu lesen - das Buch spiegelt die klare und einfache Struktur von AWK 1:1 weder. Bücher mit so hoher Informationsdichte die auch noch angenehm zu Lesen und verständlich sind findet man heute leider praktisch nicht mehr.

Liffi
Beiträge: 2306
Registriert: 02.10.2004 01:33:05

Re: Aus einer Liste eine Spalte machen???

Beitrag von Liffi » 28.10.2016 11:01:34

r4pt0r hat geschrieben: Für öfter auftretende Aufgaben schreibe ich viele tools auch mit perl - wenn man sich etwas zusammenreißt ist Perl sogar wesentlich besser und vor allem eindeutiger lesbar als z.B. python.
Citation needed ;-). Ich bin nicht ganz sicher, wie du das misst, aber ich fürchte, da würden dir viele Leute widersprechen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Aus einer Liste eine Spalte machen???

Beitrag von Meillo » 28.10.2016 22:26:06

r4pt0r hat geschrieben: Ich kann jedem nur empfehlen mal "The AWK programming language" zu lesen - das Buch spiegelt die klare und einfache Struktur von AWK 1:1 weder. Bücher mit so hoher Informationsdichte die auch noch angenehm zu Lesen und verständlich sind findet man heute leider praktisch nicht mehr.
Dem kann ich vollumfaenglich zustimmen!

(Ich habe mehrere Jahre lang den Gebrauchtbuchmarkt beobachtet, bis ich mich endlich dazu durchgerungen habe, die 25 EUR fuer das Buch auszugeben. Sie waren es definitiv wert.)
Use ed once in a while!

Antworten