Wie leite ich eine Liste von Zahlen direkt von der Shell in einen Befehl?

4

Wie leite ich eine Liste von Zahlen direkt von der Shell in einen Befehl? Zum Beispiel so etwas

[1,2,3,4] | sort

Würde geben

1
2
3 
4

BEARBEITEN:

In Beantwortung der Antworten bisher freundlicherweise. . . Ich frage das, weil ich schnell eine Konsolenanwendung testen und debuggen möchte, die viele Zahlen als Eingabe akzeptiert, ohne viele Einzelwerte eingeben zu müssen, gefolgt von Wagenrückläufen. Ich möchte einfach den "One Liner" eingeben und ab und zu auf den Aufwärtspfeil tippen, um den Befehl zu wiederholen. Im Idealfall würde ich dies gerne ohne eine Textdatei mit den Werten tun (was natürlich der einfachste Weg wäre, dies zu tun.)

learnvst
quelle

Antworten:

4

Ich gehe davon aus, dass wir einstellige Zahlen verwenden - in diesem Fall echo 1 2 4 3 | grep -o [1234567890]|sort sollte zum Trick Ich denke, Sie müssten den Regex für grep anpassen, wenn es eine mehrstellige Zahl ist.

grep -o wählt per Regex aus und druckt einen pro Zeile

edit: und eine noch elegantere Lösung.

wir benutzen immer noch echo, aber mit tr. Dies funktioniert bei Zahlen, die größer als eine Ziffer sind

echo 10,2,4,3|tr ',' '\n'|sort -g

tr wird aufgefordert, ein Komma durch eine Newline zu ersetzen, und sort -g sortiert in numerischer Reihenfolge (vorausgesetzt, das ist das, was Sie sortieren möchten).

Angenommen, Sie brauchen Die eckigen Klammern in der Liste können aus irgendeinem Grund mit entfernt werden

echo [10,2,4,3]|tr '[:punct:]' ' '|tr ' ' '\n'|sort -g

Der zusätzliche Befehl tr ersetzt jede Interpunktion durch ein Leerzeichen.

Journeyman Geek
quelle
Dein letztes Beispiel funktioniert nicht. Der Erste tr '[:punct:]' ' ' verwandelt alle Kommas vor dem zweiten in Leerzeichen tr ',' '\n' würde sie jemals sehen.
Nicole Hamilton
Ich denke, fast schon, jetzt habe ich zwei Felder vor ... Die eckigen Klammern scheinen es etwas komplizierter zu machen
Journeyman Geek
Versuchen tr -d '[]' | tr ',' '\n'.
Nicole Hamilton
5

Sie können ein "hier" -Dokument mit der << Inline-E / A-Umleitungsoperator. Die Shell sucht nach dem von Ihnen angegebenen Token (in diesem Beispiel eof ) als Dateiendemarker für das hier doc.

sort << eof
1
2
3
4
eof

Ein anderer Weg wäre, über die Werte zu iterieren, echo sie in sortieren:

for i in 1 2 3 4; do echo $i; done | sort

Wenn dir das gefallen würde for Schleife als Befehl verpackt, verwenden Sie eine Prozedur:

list() for i in $*; do echo $i; done
list 1 2 3 4 | sort
Nicole Hamilton
quelle
3
$ printf '%d\n' 1 3 2 4 | sort
1
2
3
4

oder

$ echo $'1\n2\n4\n3' | sort
1
2
3
4
John Kugelman
quelle
In einigen Staaten funktioniert die zweite Antwort besser ohne $. ich habe bekommen echo '1\n2\n4\n3' um die Ausgabe zu geben, für die Sie zeigen echo $'1\n2\n4\n3'während echo $'1\n2\n4\n3' selbst Ausgänge $1. 2. 4, und 3 (in separaten Zeilen).
Scott
2

Sie können Katze verwenden

cat | sort 
1
2
4
3
^d (end of input)
Hennes
quelle
Abgesehen davon, dass sie langsamer ist, unterscheidet sich dies nicht von sort ganz von selbst.
Nicole Hamilton
@Nicole: Das OP erklärt in einer Bearbeitung das sort ist eine Metapher für ein anderes, nicht näher bezeichnetes Programm - und dieses Programm könnte Testen Sie seine Standardeingabe, um zu sehen, ob es sich um eine TTY-Datei, eine Datei, eine Pipe oder was auch immer handelt.
Scott
@Scott Und wie ist das anders als sort als Metapher für etwas anderes, aber immer noch für sich. Das cat | fügt nichts hinzu.
Nicole Hamilton
@Nicole: Mein Punkt ist das, wenn du tippst umptyfratz Geben Sie dann eine Eingabe ein (durch Strg + D abgeschlossen) und geben Sie dann ein cat | umptyfratz gefolgt von der gleichen Eingabe erhalten Sie möglicherweise zwei unterschiedliche Verhaltensweisen. Sie sagten: "Das ist nicht anders ..."
Scott
1
@Scott, das ich vorhin veröffentlicht habe bash und nein, meinen Benutzern geht es gut. Pipes sind viel schneller, aber nach meinem Kommentar wurde mir klar, dass ich sie kostengünstig verwenden konnte, weil ich Multithreading bin. bash ist nicht und müsste sich verzweigen, um das Rohr zuzuführen. Aber lasst uns das offline verschieben. Senden Sie mir eine E-Mail an hamiltonlabs.com. Wenn Sie Windows ausführen, gebe ich Ihnen eine kostenlose Kopie meiner Arbeit und wir können darüber sprechen, was ich getan habe.
Nicole Hamilton
2

Die Antwort „supereinfach“: Geben Sie den Befehl und dann die Eingabe ein. (Genau genommen handelt es sich hierbei nicht um Pipeing. Das Wort "Pipe" wird in Bezug auf die E / A-Umleitung stark beansprucht, und dies wäre nicht einmal eine E / A-Umleitung, sondern lediglich Standard-E / A.) End with Ctrl + D (vorausgesetzt, Sie sind in irgendeiner Form * nix oder etwas Unix-ähnliches und haben Ihren EOF-Charakter nicht geändert). Zum Beispiel:

(Prompt) & gt; sort –f
Das
schnell
braun
Fuchs

Ctrl + D
braun
Fuchs
schnell
Das

(Prompt) & gt;

Das Ctrl + D kann als hallo ^Dund die erste Zeile der Ausgabe kann in derselben Zeile wie diese erscheinen:

^Dbrown
fox
quick
The
Scott
quelle