@Jefromi - hat auch cutkeine regulären Ausdrücke vor {}Aktionen, und dann ist es viel dümmer mit Feldtrennzeichen (variable Anzahl von Leerzeichen?), Und Sie müssen sie manuell angeben. Ich denke, das OP wollte von einem shift NBefehl hören, der nicht existiert. Das nächste ist $1="";$2="";(...);print}, aber in meinem Fall bleiben einige führende Leerzeichen (wahrscheinlich Trennzeichen).
Tomasz Gandor
Antworten:
50
Eine Lösung, die keine zusätzlichen führenden oder nachfolgenden Leerzeichen hinzufügt :
Die Antwort von EdMorton hat bei mir nicht funktioniert (Bash 4.1.2 (1) -Release, GNU Awk 3.1.7 oder Bash 3.2.25 (1) -Release, GNU Awk 3.1.5), aber hier einen anderen Weg gefunden:echo ' This is a test' | awk '{print substr($0, index($0,$3))}'
elysch
1
@elysch nein, das wird im Allgemeinen nicht funktionieren, es scheint nur bei bestimmten Eingabewerten zu funktionieren. Siehe den Kommentar, den ich unter Ihrem Kommentar unter meiner Antwort hinzugefügt habe.
Ed Morton
1
Hallo @fedorqui. Meine Antwort ist die erste. In meiner ursprünglichen Antwort habe ich erklärt, warum die andere Antwort nicht korrekt war (zusätzliches führendes oder nachfolgendes Leerzeichen). Einige Leute haben Verbesserungen in Kommentaren vorgeschlagen. Wir haben das OP gebeten, eine korrektere Antwort zu wählen, und er / sie hat meine ausgewählt. Nachdem einige andere Mitwirkende meine Antwort bearbeitet haben, um auf diese Antwort zu verweisen (siehe Verlauf). Ist es dir klar? Was raten Sie mir, um die Verständlichkeit meiner Antwort zu verbessern? Prost ;-)
Olibre
1
Sie haben absolut Recht und mein Missverständnis tut mir sehr leid. Ich habe die Antwort schnell gelesen und Ihre ursprüngliche Antwort nicht bemerkt (ja, ich habe zu schnell gelesen). +1 für die Antwort selbst mit dem netten Trick, um zu NF-1 zu gelangen und dann das letzte Element zu drucken, um das zusätzliche Leerzeichen zu vermeiden. Und nochmal Entschuldigung! (wird meinen Kommentar in ungefähr einem Tag entfernen, um Missverständnisse von zukünftigen Lesern zu vermeiden).
Fedorqui 'SO hör auf zu schaden'
1
Ich würde eine Art von Überschriften verwenden: <Ihre Antwort> und dann eine horizontale Regel, gefolgt von einem großen Titel "Vergleich der anderen Antworten". Andernfalls verschieben Sie diesen Vergleich auf eine andere Antwort, da die Leute anscheinend eher kurze Antworten in einer "gimme my code"
wahrscheinlich besser "NF" als "13" im letzten Beispiel zu verwenden.
Glenn Jackman
2
2 Szenario, über das OP entscheiden muss. Wenn 13 das letzte Feld ist, ist die Verwendung von NF in Ordnung. Wenn nicht, ist die Verwendung von 13 angemessen.
Ghostdog74
3
2. muss 3 Kopien von OFS ab dem Beginn von $ 0 löschen. 3. wäre besser mit printf "%s ",$i, da man nicht weiß ob ob oder ähnliches $ienthalten könnte %s. Aber das würde am Ende einen zusätzlichen Platz drucken.
Das ist schön, weil es so dynamisch ist. Sie können am Ende Spalten hinzufügen und Ihre Skripte nicht neu schreiben.
MinceMan
1
Dies zeigt das genaue Problem, mit dem sich die Frage befasst. Machen Sie genau das Gegenteil. Was ist mit dem Drucken aus dem 100. Feld? Beachten Sie, dass Sie sich nicht damit befassen NFund die Führung verlassen OFS.
Chris Seymour
24
Der richtige Weg, dies zu tun, ist ein RE-Intervall, da Sie einfach angeben können, wie viele Felder übersprungen werden sollen, und den Abstand zwischen den Feldern für die verbleibenden Felder beibehalten.
Die ersten drei Felder zu überspringen, ohne den Abstand zwischen den verbleibenden Feldern zu beeinflussen, ist angesichts des Eingabeformats, das wir in dieser Frage zu diskutieren scheinen, einfach:
Wenn Sie einen FS haben, der ein RE ist, den Sie in einem Zeichensatz nicht negieren können, können Sie ihn zuerst in ein einzelnes Zeichen konvertieren (RS ist ideal, wenn es sich um ein einzelnes Zeichen handelt, da ein RS NICHT in einem Feld angezeigt werden kann, andernfalls SUBSEP in Betracht ziehen). Wenden Sie dann die RE-Intervall-Subsitution an und konvertieren Sie sie in das OFS. zB wenn Ketten von "." die Felder trennten:
Dann haben Sie das gleiche Problem wie bei allen schleifenbasierten Lösungen, die die Felder neu zuweisen - die FSs werden in OFSs konvertiert. Wenn dies ein Problem ist, müssen Sie sich die patsplit () - Funktion von GNU awks ansehen.
Hat bei mir nicht funktioniert (Bash 4.1.2 (1) -Release, GNU Awk 3.1.7 oder Bash 3.2.25 (1) -Release, GNU Awk 3.1.5), aber hier einen anderen Weg gefunden:echo ' This is a test' | awk '{print substr($0, index($0,$3))}'
Elysch
2
Nein, das schlägt fehl, wenn $ 1 oder $ 2 die Zeichenfolge enthalten, auf die $ 3 gesetzt ist. Versuchen Sie , zum Beispiel , echo ' That is a test' | awk '{print substr($0, index($0,$3))}'und Sie werden feststellen , dass die , adie $ 3 entspricht dem ist ainnerhalb That1 in $. In einer sehr alten Version von gawk wie Sie müssen Sie RE-Intervalle mit dem Flag aktivieren --re-interval.
Ed Morton
2
Du hast recht, habe es nicht bemerkt. Übrigens, schätzen Sie Ihren Kommentar wirklich. Viele Male wollten Sie einen regulären Ausdruck mit "{}" verwenden, um die Anzahl der Elemente anzugeben, und sahen im Mann nie "--re-interval". +1 für dich.
Elysch
1
1ist eine echte Bedingung und ruft daher die Standard-awk-Aktion zum Drucken des aktuellen Datensatzes auf.
Ed Morton
1
idk wie kanonisch es ist, aber ich habe jetzt eine Antwort hinzugefügt.
Ed Morton
10
Nahezu alle Antworten fügen derzeit entweder führende Leerzeichen, nachfolgende Leerzeichen oder ein anderes Trennzeichen hinzu. Aus dem vierten Feld auszuwählen, in dem das Trennzeichen ein Leerzeichen und das Ausgabetrennzeichen ein einzelnes Leerzeichen ist, awkwäre:
Oder um sie in dieselbe Zeile zu bringen, weisen Sie $ 3 bis $ 1 usw. zu und ändern Sie dann NF in die richtige Anzahl von Feldern. echo 1 2 3 4 5| awk '{ for (i=3; i<=NF; i++) $(i-2)=$i; NF=NF-2; print $0 }'
Larsr
Hallo @larsr. Ihre vorgeschlagene Befehlszeile ist die einzige richtige Antwort. Alle anderen Antworten fügen zusätzliche Leerzeichen hinzu (führende oder nachfolgende). Bitte
poste
1
Hallo @sudo_O, ich habe mit @larsr über die Befehlszeile gesprochen, die er in seinem Kommentar vorgeschlagen hat. Ich verbrachte ungefähr fünf Minuten, bevor ich den Quiproco herausfand (Missverständnis). Ich bin damit einverstanden, dass die @ Veterin-Antwort neue Zeilen ( ORS) zwischen Felder einfügt . Bravo für Ihre Initiative (Ich mag Ihre Antwort). Cheers
Olibre
3
Eine andere Möglichkeit, die Verwendung der print-Anweisung zu vermeiden:
$ awk '{$1=$2=$3=""}sub("^"FS"*","")' file
In awk, wenn eine Bedingung erfüllt ist, ist print die Standardaktion.
+1 für die ähnliche Lösung ... Dies kann jedoch zu Leistungsproblemen führen, wenn filees groß ist (> 10-30 KB). Bei großen Dateien awkbietet die Lösung eine bessere Leistung.
Richtig
3
Die Optionen 1 bis 3 haben Probleme mit mehreren Leerzeichen (sind jedoch einfach). Aus diesem Grund sollten die Optionen 4 und 5 entwickelt werden, mit denen mehrere Leerzeichen problemlos verarbeitet werden können. Wenn die Optionen 4 oder 5 mit n=0beiden verwendet werden, bleiben natürlich alle führenden Leerzeichen erhalten, da n=0keine Aufteilung erfolgt.
Option 1
Eine einfache Schnittlösung (funktioniert mit einzelnen Trennzeichen):
$ echo '1 2 3 4 5 6 7 8'| cut -d' '-f4-45678
Option 2
Das Erzwingen einer awk-Neuberechnung löst manchmal das Problem (funktioniert mit einigen Versionen von awk) der hinzugefügten führenden Leerzeichen:
HINWEIS: Mit "^ [" FS "] *" wird eine Eingabe mit führenden Leerzeichen akzeptiert.
Option 5
Es ist durchaus möglich, eine Lösung zu erstellen, die keine zusätzlichen führenden oder nachfolgenden Leerzeichen hinzufügt und vorhandene Leerzeichen mithilfe der Funktion gensubvon GNU awk wie folgt beibehält:
In diesem Fall wird das OFS natürlich verwendet, um beide Teile der Zeile zu trennen, und der nachfolgende Leerraum der Felder wird weiterhin gedruckt.
Hinweis 1:["FS"]* wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.
Hallo BZ Deine Antwort ist nett. Option 3 funktioniert jedoch nicht für Zeichenfolgen, die mit einem Leerzeichen beginnen (z " 1 2 3 4 5 6 7 8 ". B. ). Option 4 ist nett, aber lassen Sie ein führendes Leerzeichen mit einer Zeichenfolge, die mit einem Leerzeichen beginnt. Denken Sie, ob dies reparabel ist? Sie können Befehl echo " 1 2 3 4 5 6 7 8 " | your awk script | sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'verwenden, um führende / mittlere /
nachfolgende
Hallo @olibre. Dass die Option 3 mit Leerzeichen fehlschlägt, ist der Grund für die Entwicklung der Optionen 4 und 5. Option 4 lässt nur dann ein führendes Leerzeichen übrig, wenn die Eingabe dies hat und n auf 0 gesetzt ist (n = 0). Das glaube ich ist die richtige Antwort, wenn es keine Auswahl von Feldern gibt (nichts, um IMO zu reparieren). Prost.
Gut. Vielen Dank für die zusätzlichen Informationen :-) Bitte verbessern Sie Ihre Antwort mit diesen zusätzlichen Informationen :-) Cheers
olibre
Perfekt :-) Wie schade, dass Ihr Benutzer deaktiviert ist :-(
olibre
1
Cut verfügt über ein --complement-Flag, mit dem Spalten einfach (und schnell) gelöscht werden können. Die resultierende Syntax entspricht der gewünschten Syntax, sodass die Lösung leichter zu lesen und zu verstehen ist. Komplement funktioniert auch für den Fall, dass Sie nicht zusammenhängende Spalten löschen möchten.
Hilft die obige Bearbeitung beim Verständnis? Der Punkt ist, die Komplement-Flagge des Schnitts zu verwenden. Die Lösung sollte schneller und präziser implementiert werden als AWK- oder Perl-basierte Lösungen. Es können auch beliebige Spalten geschnitten werden.
Michael zurück
1
Perl-Lösung, die keine führenden oder nachfolgenden Leerzeichen hinzufügt:
Da ich mich über die erste hoch bewertete, aber falsche Antwort geärgert habe, habe ich genug gefunden, um dort eine Antwort zu schreiben, und hier sind die falschen Antworten als solche gekennzeichnet, hier ist mein Teil. Ich mag keine vorgeschlagenen Lösungen, da ich keinen Grund sehe, die Antwort so komplex zu gestalten.
Ich habe ein Protokoll, in dem nach $ 5 mit einer IP-Adresse mehr Text oder kein Text sein kann. Ich brauche alles von der IP-Adresse bis zum Ende der Leitung, sollte es nach 5 Dollar etwas geben. In meinem Fall ist dies tatsächlich ein awk-Programm, kein awk-Oneliner, also muss awk das Problem lösen. Wenn ich versuche, die ersten 4 Felder mit der alten, gut aussehenden und am besten bewerteten, aber völlig falschen Antwort zu entfernen:
echo " 7 27.10.16. Thu 11:57:18 37.244.182.218 one two three"| awk '{$1=$2=$3=$4=""; printf "[%s]\n", $0}'
es spuckt falsche und nutzlose Antworten aus (ich habe [] hinzugefügt, um zu demonstrieren):
[37.244.182.218 one two three]
Wenn die Spalten eine feste Breite haben, bis der Schnittpunkt und awk benötigt werden, lautet die richtige und recht einfache Antwort:
echo " 7 27.10.16. Thu 11:57:18 37.244.182.218 one two three"| awk '{printf "[%s]\n", substr($0,28)}'
Das %-5srichtet das Ergebnis als 5 Zeichen breite Spalten aus. Wenn dies nicht ausreicht, erhöhen Sie die Anzahl oder verwenden %sSie stattdessen (mit einem Leerzeichen), wenn Sie sich nicht für die Ausrichtung interessieren.
AWK printf-basierte Lösung, die% -Probleme vermeidet und insofern einzigartig ist, als sie nichts zurückgibt (kein Rückgabezeichen), wenn weniger als 4 Spalten gedruckt werden müssen:
cut -f3-
?cut
keine regulären Ausdrücke vor{}
Aktionen, und dann ist es viel dümmer mit Feldtrennzeichen (variable Anzahl von Leerzeichen?), Und Sie müssen sie manuell angeben. Ich denke, das OP wollte von einemshift N
Befehl hören, der nicht existiert. Das nächste ist$1="";$2="";(...);print}
, aber in meinem Fall bleiben einige führende Leerzeichen (wahrscheinlich Trennzeichen).Antworten:
Eine Lösung, die keine zusätzlichen führenden oder nachfolgenden Leerzeichen hinzufügt :
Sudo_O schlägt eine elegante Verbesserung mit dem ternären Operator vor
NF?ORS:OFS
EdMorton bietet eine Lösung, bei der die ursprünglichen Leerzeichen zwischen den Feldern erhalten bleiben :
BinaryZebra bietet auch zwei fantastische Lösungen:
(Diese Lösungen bewahren sogar nachgestellte Leerzeichen von der ursprünglichen Zeichenfolge)
Die von larsr in den Kommentaren angegebene Lösung ist fast richtig:
Dies ist die feste und parametrisierte Version der Larsr- Lösung:
Alle anderen Antworten vor September 2013 sind nett, aber fügen Sie zusätzliche Leerzeichen hinzu:
Beispiel für eine Antwort, bei der zusätzliche führende Leerzeichen hinzugefügt werden :
Beispiel für eine Antwort, die zusätzlichen nachgestellten Speicherplatz hinzufügt
quelle
echo ' This is a test' | awk '{print substr($0, index($0,$3))}'
quelle
OFS
da Sie sich nicht mit demNF
führenden Platz in den Datensätzen befassen .Verwenden Sie Schnitt
oder wenn Sie auf awk bestehen und $ 13 das letzte Feld ist
sonst
quelle
printf "%s ",$i
, da man nicht weiß ob ob oder ähnliches$i
enthalten könnte%s
. Aber das würde am Ende einen zusätzlichen Platz drucken.Versuche dies:
quelle
NF
und die Führung verlassenOFS
.Der richtige Weg, dies zu tun, ist ein RE-Intervall, da Sie einfach angeben können, wie viele Felder übersprungen werden sollen, und den Abstand zwischen den Feldern für die verbleibenden Felder beibehalten.
Die ersten drei Felder zu überspringen, ohne den Abstand zwischen den verbleibenden Feldern zu beeinflussen, ist angesichts des Eingabeformats, das wir in dieser Frage zu diskutieren scheinen, einfach:
Wenn Sie führende Leerzeichen und nicht leere Leerzeichen aufnehmen möchten, aber wieder mit dem Standard-FS, dann ist es:
Wenn Sie einen FS haben, der ein RE ist, den Sie in einem Zeichensatz nicht negieren können, können Sie ihn zuerst in ein einzelnes Zeichen konvertieren (RS ist ideal, wenn es sich um ein einzelnes Zeichen handelt, da ein RS NICHT in einem Feld angezeigt werden kann, andernfalls SUBSEP in Betracht ziehen). Wenden Sie dann die RE-Intervall-Subsitution an und konvertieren Sie sie in das OFS. zB wenn Ketten von "." die Felder trennten:
Wenn OFS ein einzelnes Zeichen ist UND es nicht in den Eingabefeldern angezeigt werden kann, können Sie dies natürlich reduzieren auf:
Dann haben Sie das gleiche Problem wie bei allen schleifenbasierten Lösungen, die die Felder neu zuweisen - die FSs werden in OFSs konvertiert. Wenn dies ein Problem ist, müssen Sie sich die patsplit () - Funktion von GNU awks ansehen.
quelle
echo ' This is a test' | awk '{print substr($0, index($0,$3))}'
echo ' That is a test' | awk '{print substr($0, index($0,$3))}'
und Sie werden feststellen , dass die ,a
die $ 3 entspricht dem ista
innerhalbThat
1 in $. In einer sehr alten Version von gawk wie Sie müssen Sie RE-Intervalle mit dem Flag aktivieren--re-interval
.1
ist eine echte Bedingung und ruft daher die Standard-awk-Aktion zum Drucken des aktuellen Datensatzes auf.Nahezu alle Antworten fügen derzeit entweder führende Leerzeichen, nachfolgende Leerzeichen oder ein anderes Trennzeichen hinzu. Aus dem vierten Feld auszuwählen, in dem das Trennzeichen ein Leerzeichen und das Ausgabetrennzeichen ein einzelnes Leerzeichen ist,
awk
wäre:So parametrisieren Sie das Startfeld:
Und auch das Endfeld:
quelle
Eingang
Ausgabe
quelle
quelle
echo 1 2 3 4 5| awk '{ for (i=3; i<=NF; i++) $(i-2)=$i; NF=NF-2; print $0 }'
ORS
) zwischen Felder einfügt . Bravo für Ihre Initiative (Ich mag Ihre Antwort). CheersEine andere Möglichkeit, die Verwendung der print-Anweisung zu vermeiden:
In awk, wenn eine Bedingung erfüllt ist, ist print die Standardaktion.
quelle
awk '{$1=$2=$3=""}sub("^"OFS"+","")' file
ebenso wie das OFS, was nach dem Ändern des Inhalts von $ 1, $ 2 und $ 3 übrig bleibt.Ich kann nicht glauben, dass niemand eine einfache Muschel angeboten hat:
quelle
file
es groß ist (> 10-30 KB). Bei großen Dateienawk
bietet die Lösung eine bessere Leistung.Die Optionen 1 bis 3 haben Probleme mit mehreren Leerzeichen (sind jedoch einfach). Aus diesem Grund sollten die Optionen 4 und 5 entwickelt werden, mit denen mehrere Leerzeichen problemlos verarbeitet werden können. Wenn die Optionen 4 oder 5 mit
n=0
beiden verwendet werden, bleiben natürlich alle führenden Leerzeichen erhalten, dan=0
keine Aufteilung erfolgt.Option 1
Eine einfache Schnittlösung (funktioniert mit einzelnen Trennzeichen):
Option 2
Das Erzwingen einer awk-Neuberechnung löst manchmal das Problem (funktioniert mit einigen Versionen von awk) der hinzugefügten führenden Leerzeichen:
Option 3
Durch Drucken jedes mit formatierten Felds erhalten Sie
printf
mehr Kontrolle:Alle vorherigen Antworten ändern jedoch alle FS zwischen Feldern in OFS. Lassen Sie uns ein paar Lösungen dafür entwickeln.
Option 4
Eine Schleife mit Sub zum Entfernen von Feldern und Trennzeichen ist portabler und löst keine Änderung von FS zu OFS aus:
HINWEIS: Mit "^ [" FS "] *" wird eine Eingabe mit führenden Leerzeichen akzeptiert.
Option 5
Es ist durchaus möglich, eine Lösung zu erstellen, die keine zusätzlichen führenden oder nachfolgenden Leerzeichen hinzufügt und vorhandene Leerzeichen mithilfe der Funktion
gensub
von GNU awk wie folgt beibehält:Es kann auch verwendet werden, um eine Feldliste mit einer bestimmten Anzahl auszutauschen
n
:In diesem Fall wird das OFS natürlich verwendet, um beide Teile der Zeile zu trennen, und der nachfolgende Leerraum der Felder wird weiterhin gedruckt.
Hinweis 1:
["FS"]*
wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.quelle
" 1 2 3 4 5 6 7 8 "
. B. ). Option 4 ist nett, aber lassen Sie ein führendes Leerzeichen mit einer Zeichenfolge, die mit einem Leerzeichen beginnt. Denken Sie, ob dies reparabel ist? Sie können Befehlecho " 1 2 3 4 5 6 7 8 " | your awk script | sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
verwenden, um führende / mittlere /Cut verfügt über ein --complement-Flag, mit dem Spalten einfach (und schnell) gelöscht werden können. Die resultierende Syntax entspricht der gewünschten Syntax, sodass die Lösung leichter zu lesen und zu verstehen ist. Komplement funktioniert auch für den Fall, dass Sie nicht zusammenhängende Spalten löschen möchten.
quelle
Perl-Lösung, die keine führenden oder nachfolgenden Leerzeichen hinzufügt:
Das Perl-
@F
Autosplit-Array beginnt am Index,0
während awk-Felder mit beginnen$1
Perl-Lösung für durch Kommas getrennte Daten:
Python-Lösung:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[3:]) + '\n') for line in sys.stdin]" < file
quelle
Für mich ist die kompakteste und konformste Lösung für die Anfrage
Und wenn Sie mehr Zeilen als beispielsweise die Datei foo.txt verarbeiten müssen, vergessen Sie nicht, i auf 0 zurückzusetzen:
Danke dein Forum.
quelle
Da ich mich über die erste hoch bewertete, aber falsche Antwort geärgert habe, habe ich genug gefunden, um dort eine Antwort zu schreiben, und hier sind die falschen Antworten als solche gekennzeichnet, hier ist mein Teil. Ich mag keine vorgeschlagenen Lösungen, da ich keinen Grund sehe, die Antwort so komplex zu gestalten.
Ich habe ein Protokoll, in dem nach $ 5 mit einer IP-Adresse mehr Text oder kein Text sein kann. Ich brauche alles von der IP-Adresse bis zum Ende der Leitung, sollte es nach 5 Dollar etwas geben. In meinem Fall ist dies tatsächlich ein awk-Programm, kein awk-Oneliner, also muss awk das Problem lösen. Wenn ich versuche, die ersten 4 Felder mit der alten, gut aussehenden und am besten bewerteten, aber völlig falschen Antwort zu entfernen:
es spuckt falsche und nutzlose Antworten aus (ich habe [] hinzugefügt, um zu demonstrieren):
Wenn die Spalten eine feste Breite haben, bis der Schnittpunkt und awk benötigt werden, lautet die richtige und recht einfache Antwort:
welches die gewünschte Ausgabe erzeugt:
quelle
Ich habe diese andere Möglichkeit gefunden, vielleicht könnte sie auch nützlich sein ...
awk 'BEGIN {OFS=ORS="\t" }; {for(i=1; i<14; i++) print $i " "; print $NF "\n" }' your_file
Hinweis: 1. Für tabellarische Daten und von Spalte $ 1 bis $ 14
quelle
Verwenden Sie Schnitt:
zB: Wenn Sie
file1
enthalten haben:car.is.nice.equal.bmw
Ausführen:
cut -d . -f1,3 file1
wird gedrucktcar.is.nice
quelle
Dies ist nicht sehr weit von einigen der vorherigen Antworten entfernt, löst jedoch einige Probleme:
cols.sh
::Was Sie jetzt mit einem Argument aufrufen können, das die Startspalte sein wird:
Oder:
Dies ist 1-indiziert; Wenn Sie eine Nullindizierung bevorzugen, verwenden Sie
i=s + 1
stattdessen.Wenn Sie außerdem Argumente für den Startindex und den Endindex benötigen, ändern Sie die Datei in:
Beispielsweise:
Das
%-5s
richtet das Ergebnis als 5 Zeichen breite Spalten aus. Wenn dies nicht ausreicht, erhöhen Sie die Anzahl oder verwenden%s
Sie stattdessen (mit einem Leerzeichen), wenn Sie sich nicht für die Ausrichtung interessieren.quelle
AWK printf-basierte Lösung, die% -Probleme vermeidet und insofern einzigartig ist, als sie nichts zurückgibt (kein Rückgabezeichen), wenn weniger als 4 Spalten gedruckt werden müssen:
Testen:
quelle