Ich habe mehrzeilige Textdateien mit (manchmal) tabulatorgetrennten Daten. Ich möchte die Datei ausgeben, damit ich einen Blick darauf werfen kann - also möchte ich nur die ersten 80 Zeichen jeder Zeile sehen (ich habe die Textdatei so gestaltet, dass das Wichtige in jeder Zeile an erster Stelle steht).
Ich hatte gedacht, ich könnte cat verwenden, um jede Zeile der Datei zu lesen und jede Zeile an den nächsten Befehl in einer Pipe zu senden:
cat tabfile | cut -c -80
Aber das schien kaputt zu sein. Ich habe versucht, herumzuspielen, und grep schien zu funktionieren - aber dann habe ich herausgefunden, dass dies nicht der Fall ist (nicht jede Zeile in der Datei hatte mehr als 80 Zeichen) - es scheint, dass Tabulatoren nach Schnitt als einzelne Zeichen gezählt werden.
Ich habe es versucht:
cat tabfile | tr \t \040 | cut -c -80
Auch wenn dies meine Daten ein wenig beschädigen würde, indem die Lesbarkeit des Leerraums beseitigt wird. Aber das hat nicht funktioniert. Weder tat:
cat tabfile | tr \011 \040 | cut -c -80
Vielleicht benutze ich tr falsch? Ich hatte zuvor Probleme mit tr, weil ich mehrere Leerzeichen entfernen wollte (anscheinend hat die Version von tr, auf die ich auf diesem Computer Zugriff habe, die Option -s, um mehrere Zeichen zusammenzudrücken - ich muss möglicherweise mehr damit spielen).
Ich bin mir sicher, wenn ich herumspielen würde, könnte ich Perl, Awk oder Sed oder etwas anderes verwenden, um dies zu tun.
Ich möchte jedoch eine Lösung, die (POSIX?) Reguläre Befehle verwendet, damit sie so portabel wie möglich ist. Wenn ich am Ende tr verwende, würde ich wahrscheinlich versuchen, Tabulatoren in Zeichen umzuwandeln, vielleicht eine Berechnung durchzuführen, die Berechnung zu kürzen und diese Zeichen dann wieder in Tabulatoren für die Ausgabe umzuwandeln.
Es muss keine einzelne Zeile sein / direkt in die Befehlszeile eingegeben werden - ein Skript ist in Ordnung.
Weitere Infos zu Tab-Dateien:
Ich benutze die Registerkarte, um Felder zu unterbrechen, weil ich eines Tages möglicherweise Daten in ein anderes Programm importieren möchte. Daher habe ich in der Regel nur eine Registerkarte zwischen den Inhalten. Ich verwende aber auch Registerkarten, um Dinge an vertikalen Spalten auszurichten und die Lesbarkeit beim Betrachten der Nur-Text-Datei zu verbessern. Das bedeutet, dass ich für einige Textteile das Ende des Inhalts mit Leerzeichen auffülle, bis ich an der Stelle bin, an der die Registerkarte das nächste Feld mit den darüber und darunter liegenden ausrichtet.
DarkTurquoise # 00CED1 Meere, Himmel, Ruderboote Natur MediumSpringGreen # 00FA9A Nützlich für Bäume Magie Limette # 00FF00 Nur zur Verwendung bei Frühlingshühnern und Obst
quelle
pr
voncoreutils
:pr -1 -t -l200 -W80 file
. Erhöhen / verringern Sie die Seitenlänge (Anzahl nach-l
) nach Bedarf.Antworten:
Ich denke du suchst
expand
und / oderunexpand
. Anscheinend versuchen Sie sicherzustellen, dass eine\t
ab-Breite als 8 Zeichen und nicht als einzelnes Zeichen zählt.fold
wird das auch tun, aber es wird seine Eingabe in die nächste Zeile umbrechen, anstatt sie abzuschneiden. Ich denke du willst:expand
undunexpand
sind beide POSIX angegeben :expand
Dienstprogramm schreibt Dateien oder die Standardeingabe in die Standardausgabe, wobei\t
ab-Zeichen durch ein oder mehrere Leerzeichen ersetzt werden , die zum Auffüllen des nächsten Tabulators erforderlich sind. Alle Rücktastezeichen werden in die Ausgabe kopiert und bewirken, dass die Anzahl der Spaltenpositionen für Tabulatorberechnungen dekrementiert wird. Die Anzahl der Spaltenpositionen darf nicht unter Null dekrementiert werden.Ziemlich einfach. Hier ist ein Blick darauf, was dies bewirkt:
Die
until
Schleife oben erhält eine Reihe von Daten wie ...Es
printf
s dies mit der%*s
Arg- padding Flagge so für jeden der in dem Satz mittelsprintf
Tampon mit so viele Felder wie in der Nummer des Arguments sind. Jedem wird ein\t
ab-Zeichen angehängt .Alle
tee
s werden verwendet, um die Auswirkungen jedes Filters beim Anwenden anzuzeigen.Und die Auswirkungen sind folgende:
Diese Reihen sind in zwei Sätzen wie ...
printf ...; echo
tr ...
oderexpand
cut
wc
Die oberen vier Zeilen sind die Ergebnisse des
tr
Filters, bei dem jeder\t
ab in ein einzelnes Leerzeichen konvertiert wird .Und die unteren vier die Ergebnisse der
expand
Kette.quelle
Da die Laschen als Begrenzung mehr für die Ausrichtung sind, könnte ein Weg zu benutzen ,
column
und danncut
:Es scheint
column
nicht POSIX zu sein. Es ist Teil der BSD-Utils unter Ubuntu, daher gehe ich davon aus, dass es ziemlich plattformübergreifend ist.quelle
column
diese Weise würde OP nicht einmal das manuelle Hinzufügen von Leerzeichen zum Ausrichten benötigen.Dons Vorschlag in den Kommentaren war ein guter Anfang.
Dies ist, was ich brauchte, damit es (meistens) funktioniert:
Das
-m
wurde benötigt, damit das-w
Flag für eine einzelne Spalte wirksam wird. Die Manpage könnte neu geschrieben werden, um dies anzuzeigen.Beim Versuch einer Problemumgehung stellte ich fest, dass Zeichen
pr
ausgegeben werden\t
, sodass das Zuführen der Ergebnisse zucut
demselben Problem führte.-1
(die Spaltenflagge) sagt speziell in der Manpage:Ohne diese Option werden
pr
Linien jedoch wohl oder übel abgeschnitten, und zwar viel kürzer als die angegebene Länge.pr
Fügt auch ein Leerzeichen vor (oder nach?) jedem Wort in ein Feld ein (dh jeder Ort, an dem ich ein einzelnes Leerzeichen habe, hat nach der Verarbeitung zwei). Wenn zu viele Wörter vorhanden sind, ignorieren die eingefügten Leerzeichen die-w
Einschränkung (Erstellen eines Umlaufs). Aber seltsamerweise bleiben ansonsten nicht durch Tabulatoren getrennte (dh durch Leerzeichen angeordnete) "Spalten" in einer Reihe.quelle
Verwenden von
awk
:Basierend auf Chris Downs Antwort hier .
quelle
Ein Dienstprogramm, das sich wirklich der Anzeigebreite bewusst sein sollte, ist
fold
: Leider scheint es keine Option zum Verwerfen statt zum Umbrechen zu geben. Obwohl es wahrscheinlich schrecklich ineffizient ist, könnten Sie so etwas tunquelle