Ich kenne den Befehl seq
, eine Folge von ganzen Zahlen pro Zeile zu generieren, möchte aber zwei Fragen stellen:
Ist es möglich, die Nummern der Sequenz in dieselbe Zeile zu schreiben?
Ist es möglich, eine Zeichenfolge zu erstellen, die aus einer durch ein Leerzeichen getrennten Folge von Zahlen besteht?
echo $(seq 1 10)
Antworten:
Mit
bash
,zsh
undksh93
können Sie die {start..end..step} Klammer-Erweiterungsform verwenden :quelle
GNU
seq
verwendet die-s
Option separator ( ):quelle
echo $(seq 5)
funktioniert gut.Portabel für alle Shells und alle Systeme mit seq (da diese Frage mit einem Tag versehen ist)
Wenn start 1 ist:
Andernfalls:
Mit bc:
In Bash
Hinweis:
Diese Echolösung funktioniert, wenn der Wert von IFS eine neue Zeile enthält, was standardmäßig der Fall ist.
Standardmäßig ist IFS auf die Reihenfolge <Leerzeichen> <Tabulator> <Zeilenvorschub> eingestellt . Und wird bei jedem Neustart der Shell zurückgesetzt. Wenn Sie jedoch befürchten, dass sich dies in einem extremen Eckfall geändert hat, haben wir verschiedene Lösungen.
Das Zurücksetzen des IFS-Werts unter sh kann jedoch kompliziert sein. Lesen Sie das vollständige Detail hier .
Deaktivieren Sie IFS.
wird immer funktionieren. Vorausgesetzt, es gibt keinen Code darunter (oder untergeordnete Skripte), für die IFS festgelegt werden muss, wie z. B. ein Skript, das dies tut
OldIFS="$IFS"
.Richtige Lösung.
Mit einem Trick für sh:
quelle
IFS='<space><tab><newline>'
wo diejenigen<space>
,<tab>
,<newline>
sind die entsprechenden wörtlichen Zeichen.Benutze das:
quelle
...oder...
Die beiden obigen Befehle trennen die Ganzzahlen durch Leerzeichen.
xargs
Standardmäßig wird imitiert,/bin/echo
und daher wird jede Ganzzahl durch ein einzelnes Leerzeichen getrennt. Es wird jedoch standardmäßig eine maximale Befehlszeilenlänge von 128 KB verwendet. Sie können dies einstellen ...... druckt 1. Der Wert für
-s
hier ist nicht willkürlich - ich habe ihn erhalten, nachdem ich einen höheren Wert ausprobiert habe (was anscheinend trotzdem funktioniert hat), aber anschließendxargs
die hilfreiche Meldung gedruckt:paste
ist meines Wissens eines von zwei POSIX-sanktionierten Dienstprogrammen für die Verarbeitung von Zeilen beliebiger Länge:paste
Der Standardwert ist ein Tabulatorbegrenzer. Nach dem zweiten Befehl wird zwischen den einzelnen Ganzzahlen ein Tabulator eingefügt. Sie können...... den
-d
Elimiter-Schalter verwenden, um dieses Verhalten zu ändern,quelle
seq 10 | xargs
funktioniert gut, aber wegen der Befehlszeilenbeschränkungen werdenseq 100000 | xargs
5 durch\n
Trennzeichen getrennte Zeilenpaste and
cut` sind die beiden von POSIX sanktionierten Dienstprogramme für das Arbeiten mit Zeilen beliebiger Länge. Das heißt,xargs | xargs
ist eine Option. Oder sonstseq 100000|tr \\n \
$IFS
mit einer Zahl? Und inbash
seiner schrecklichen Langsamkeit sowieso. In deiner Antwort sprichst du darübersh
- du musst$IFS
in diesem Kontext nicht einmal einstellen - es wird über die Umgebung weitergeleitet, wenn es dort eingestellt ist. Und es ist nicht kürzer als das,seq 100000|paste -s
was es leistungsmäßig mit 5: 1 schlägt. Undpaste
kommt nicht mit irgendwelchen Fallstricken.$IFS
- ich benutze es die ganze Zeit - aber ich benutze es nicht, wenn ich es nicht gesetzt habe und du auch nicht. Vor allem sollten Sie es nicht zufälligen Fremden empfehlen, die es nicht besser wissen. Überlassen Sie es nicht dem Zufall - es ist ein Computerprogramm. Es ist ein Fehler, wenn es sich unerwartet verhält - warum sollte man das zulassen?