Ich habe mir diese Frage angesehen und mich gefragt, ob das Folgende vom Terminal aus möglich ist. Ich habe es in Python gemacht, wollte nur sehen, ob es über Terminal, Bash-Scripting oder was auch immer gemacht werden kann.
Angenommen, ich habe eine Datei, die so aussieht:
2,4,5,14,9
40,3,5,10,1
könnte es so sortiert werden, nach Zeilen (Zeilen)
2,4,5,9,14
1,3,5,10,40
oder ist es zu kompliziert? Ich habe es mit Python gemacht, ich möchte nur wissen, ob es möglich ist, damit ich das nächste Mal Python nicht benutze. Was ich getan habe, ist Listen zu erstellen und sie zu sortieren.
5
und14
in Ihrem Eingabebeispiel hinzugefügt . Aufgrund Ihrer Ausgabe gehe ich davon aus, dass dies ein Tippfehler war. Bitte klären Sie, ob dies nicht der Fall war.Antworten:
Hier ist ein weiterer Perl-Ansatz:
Und noch eine Shell / Coreutils (obwohl ich persönlich die exzellente Antwort von Steeldriver bevorzuge, die dieselbe Idee verwendet):
quelle
Dies sollte ungefähr das tun, wonach Sie suchen. Es liest eine Datei (test.txt) und erstellt eine Ausgabedatei (sorted.txt) mit den sortierten Zeilen in der Reihenfolge, in der sie in der Originaldatei erscheinen.
quelle
2,4,5 14,9
?while read line; do ...; done < test.txt
Die einzige wirkliche Schwierigkeit bei der Ausführung von Befehlszeilenskripten besteht darin, dass die verfügbare
sort
Funktion erwartet, dass Zeilen innerhalb einer Datei und nicht Felder innerhalb einer Zeile sortiert werden . Um dies zu umgehen, können Sie die Feldtrennzeichen vor dersort
Funktion zeilenweise durch Zeilenumbrüche ersetzen und die Zeilenumbrüche nach dem Sortieren in jeder Zeile erneut durch Trennzeichen ersetzen.Es gibt eine Reihe von verfügbaren Textverarbeitungs Dienstprogramme , die Sie würde es ermöglichen , das zu tun (einschließlich
sed
,awk
oder auch die einfachentr
) aber die Bash - Shell selbst heutzutage viel zu tun. Angenommen, Sie wollten, dass die Eingabe durch Kommas getrennt wird (in Ihrem Beispiel haben Sie eine Mischung aus Kommas und Leerzeichen), können Sie Folgendes tun:Wenn Sie tun müssen , um Griffraum - Trennzeichen in der Eingabe, dann kann man sich als Teil einer Zeichenliste hinzufügen
[, ]
zur Eingabe Teilzeichenfolge Ersatz:(Beachten Sie, dass die Ausgabe jedoch streng durch Kommas getrennt bleibt).
quelle
Hier kommt eine
awk
Lösung,Erläuterung:
awk '{ n=split($1,a,","); asort(a); for(i=0;i<=n;i++) { print a[i];}}'
awk Teilt das Feld 1 nach dem Trennzeichen
,
und speichert jeden Wert im Array.a
Schließlich wird die oberste Position in der Variablen gespeichertn
. Die nächsteasort(a)
Funktion sortiert die Array-Werte. Anschließend druckt die for-Schleife im Befehl awk die sortierten Werte im Format Datensatz für Datensatz.xargs | sed -e 's/ /,/g'
xargs
kombiniert alle Zeilen zu einer einzigen Zeile.sed -e 's/ /,/g'
Es ersetzt die Leerzeichen durch Kommas
,
while read -r line;
Alle oben genannten
awk
,xargs
,sed
sind Funktionen done Zeile für Zeile mit Hilfe derwhile
Schleife.quelle
python -c "your code here" input.txt
Oder wenn Ihr Programm mehrere Zeilen hat und
eval()
zu langsam ist:python yourprogram.py input.txt
Dieser Oneliner funktioniert:
quelle
Mit tr und sed
Ähnlich wie jkt123 :
Es iteriert über die Zeilen und ersetzt für jede Zeile Kommas durch Zeilenumbrüche, sortiert die resultierenden Zeilen numerisch und wandelt Zeilenumbrüche wieder in Kommas um. Das Hauptproblem ist, dass dies das gesamte Ergebnis mit einem Komma und nicht mit einer neuen Zeile beendet, die von diesem letzten Sed angesprochen wird. Es entfernt das letzte Komma und fügt seiner Ausgabe implizit eine neue Zeile hinzu.
Verwenden von Bash-Arrays
Hier ist ein anderer Ansatz, um dieses Problem „Mit Kommas verbinden“ zu lösen:
Oder mit Zeilenumbrüchen geschrieben:
Es verwendet ein Bash-Array, um das Ergebnis der sortierten Zeile zu speichern, und verwendet die Art und Weise, wie Bash Arrays mithilfe der
IFS
speziellen Variablen in Zeichenfolgenliterale erweitert .quelle
Sie können dies einfach mit Perl tun
Betrachten Sie, Sie haben Datei
text.txt
Der folgende Perl-Code sortiert nun die Zeilen
text.txt
Nach dem Sortieren
quelle
perl -i -lne 'print join (",", sort {$a <=> $b} split(",", $_));' text.txt
. Das-n
Flag ist dasselbe wiewhile(<>){}
und-l
fügt\n
jedem Druckaufruf ein hinzu und aktiviert auch implizitchomp()
.Die
kürzesteLösung mit einem Perl-Oneliner:quelle
Ich brauchte diese Funktionalität auch und fand eine Lösung wie folgt (vorausgesetzt, die Daten befinden sich in der Testdatei):
quelle