Ich habe eine Datei mit den Zeilen wie unten.
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
Wie kann ich das erreichen?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
text-processing
columns
Dens
quelle
quelle
Antworten:
Werfen Sie einen Blick auf den GNU-Datamash , der wie folgt verwendet werden kann
datamash transpose
. Eine zukünftige Version wird auch Kreuztabellen unterstützen (Pivot-Tabellen)quelle
Abgesehen von einer benutzerdefinierten Lösung, mit der Zeilen und Spalten über eine Befehlszeile transponiert werden können, ist das einzige Tool, das ich jemals gesehen habe, ein ironisch genanntes Tool
transpose
.Installation
Leider ist es in keinem Repo, daher müssen Sie es herunterladen und kompilieren. Dies ist ziemlich einfach, da es keine zusätzlichen Bibliotheken gibt, von denen es abhängig ist. Dies kann folgendermaßen erreicht werden:
Verwendung
Es kann problemlos mit einfachen Textdateien umgehen. Beispielsweise:
Kann mit diesem Befehl transponiert werden:
Dieser Befehl ist
transpose
transponieren (-t
) und das zu verwendende Feldtrennzeichen ist ein Leerzeichen (--fsep " "
).Dein Beispiel
Da Ihre Beispieldaten ein etwas komplexeres Format haben, müssen sie in zwei Phasen bearbeitet werden. Zuerst müssen wir es in ein Format übersetzen,
transpose
das damit umgehen kann.Wenn Sie diesen Befehl ausführen, werden die Daten in einem horizontaleren Format angezeigt:
Jetzt müssen wir nur die sekundären Vorkommen von title1, title2 usw. entfernen:
Es ist jetzt in einem Format,
transpose
das damit umgehen kann. Der folgende Befehl übernimmt die gesamte Umsetzung:quelle
Sie
awk
können dann die Daten verarbeitenpaste
undcolumn
formatieren.Hier nehme ich an,
title1
ist nur ein Beispiel in Ihrem Beitrag, und diese Daten enthalten:
nur als Trennzeichen zwischen Header + Daten.n
Gibt an, wie viele Spalten gedruckt werden sollen (Striche inpaste
).Wenn Sie es flexibler und wartungsfreundlicher gestalten möchten, können Sie es als Skript schreiben. Hier ist ein Beispiel für die Verwendung von Bash-Wrapper für
awk
und die Weiterleitung ancolumn
. Auf diese Weise können Sie auch weitere Datenprüfungen durchführen, z. B. um sicherzustellen, dass die Überschriften in allen Zeilen korrekt sind.Wird normalerweise verwendet als:
Wenn die Überschriften immer kürzer sind als die Daten, können Sie auch die Breite der Überschriften speichern und dann
printf
mit%-*s
undcolumn
alles zusammen überspringen .quelle
Hier ist eine schnelle Möglichkeit, die Datei in das gewünschte Format zu bringen:
Wenn Sie die Spaltenüberschriften möchten:
So funktioniert der 2. Befehl
Drucken Sie das Banner Setzen Sie eine Rückkehr nach dem Banner in Drucken der Datenzeilenquelle
GNU Datamash-Dienstprogramm
Aus dieser Site entnommen, https://www.gnu.org/software/datamash/ und http://www.thelinuxrain.com/articles/transposing-rows-and-columns-3-methods
quelle
Es gibt wahrscheinlich eine prägnantere Art, dies zu formulieren, aber dies scheint den allgemeinen Effekt zu erzielen:
Mehrfachaufrufe
sed
fühlen sich nicht richtig an (und ich bin mir ziemlich sicher, dass sed auch die neue Zeilenübersetzung ausführen kann), daher ist dies wahrscheinlich nicht der direkteste Weg, dies zu tun. Dadurch werden auch die potenziellen Überschriften entfernt. Sie können diese jedoch manuell generieren, sobald Sie die Zeilen / Felder ordnungsgemäß formatiert haben.Eine bessere Antwort wäre wahrscheinlich destillieren , dass Wirkung auf nur mit
sed
oderawk
dies zu tun , so dass Sie nur eine Sache auf einmal zu gehen. Aber ich bin müde, also konnte ich das zusammenstellen.quelle
paste
ist wahrscheinlich die beste Wahl. Sie können die entsprechenden Bits mit extrahierencut
,grep
undawk
so:Wenn die 5. Spalte entfernt werden soll, fügen Sie Folgendes hinzu
awk 'NR%5'
:Jetzt kolumnieren mit
paste
:Ausgabe:
quelle
Nur für den transponierten Teil hatte ich kürzlich ein ähnliches Problem und verwendete:
Stellen Sie den fmt nach Bedarf ein. Für jede Eingabezeile werden die einzelnen Felder zu einem Array-Element verkettet. Beachten Sie, dass die Verkettung von awk-Zeichenfolgen implizit ist: Dies geschieht, wenn Sie zwei Dinge ohne Operator schreiben.
Beispiel I / O:
Ausgabe:
quelle
Das Einfachste, was Sie tun können, ist,
cut
die Feldertr
auszuschneiden und dann zu verwenden, wenn Sie Zeilen in Spalten transponieren, indem Sie das Zeilenvorschubzeichen durch ein Tabulatorzeichen ersetzen: http://www.gnu.org/software/coreutils/manual/ coreutils.html # tr-Aufrufquelle
cut
ein Fehler zurückgegeben.