it-swarm.com.de

Wie kann ich die Zeilen in einer Datei mit Standardwerkzeugen unter Red Hat Linux zufällig sortieren?

Wie kann ich die Zeilen in einer Datei mit Standardwerkzeugen unter Red Hat Linux zufällig sortieren?

Ich habe nicht den Befehl shuf, daher suche ich nach etwas wie einem Perl oder awk Einzeiler, der die gleiche Aufgabe ausführt.

95
Stuart Woodward

Und einen Perl-Einzeiler bekommen Sie!

Perl -MList::Util -e 'print List::Util::shuffle <>'

Es wird ein Modul verwendet, das jedoch Teil der Perl-Codeverteilung ist. Wenn das nicht gut genug ist, können Sie erwägen, Ihre eigenen zu rollen.

Ich habe versucht, dies mit dem -i flag ("Vor Ort bearbeiten"), damit die Datei bearbeitet wird. Die Dokumentation schlägt vor, dass es funktionieren sollte, tut es aber nicht. Die gemischte Datei wird weiterhin als stdout angezeigt, diesmal wird jedoch das Original gelöscht. Ich schlage vor, Sie verwenden es nicht.

Betrachten Sie ein Shell-Skript:

#!/bin/sh

if [[ $# -eq 0 ]]
then
  echo "Usage: $0 [file ...]"
  exit 1
fi

for i in "[email protected]"
do
  Perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new
  if [[ `wc -c $i` -eq `wc -c $i.new` ]]
  then
    mv $i.new $i
  else
    echo "Error for file $i!"
  fi
done

Ungetestet, funktioniert aber hoffentlich.

62
Chris Lutz

Ähm, lass uns nicht vergessen

sort --random-sort
201
Jim T

shuf ist der beste Weg.

sort -R ist schmerzhaft langsam. Ich habe gerade versucht, eine 5-GB-Datei zu sortieren. Ich habe nach 2,5 Stunden aufgegeben. Dann hat shuf es in einer Minute sortiert.

109
Michal Illich
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

Lesen Sie die Datei, stellen Sie jeder Zeile eine Zufallszahl voran, sortieren Sie die Datei nach diesen zufälligen Präfixen und schneiden Sie die Präfixe anschließend aus. Einzeiler, der in jeder semi-modernen Shell funktionieren sollte.

BEARBEITEN: aufgenommen Richard Hansens Bemerkungen.

22
ChristopheD

Ein Einzeiler für Python:

python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile

Und um nur eine einzelne zufällige Zeile zu drucken:

python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile

Aber siehe dieser Beitrag für die Nachteile von Pythons random.shuffle(). Mit vielen Elementen (mehr als 2080) funktioniert es nicht gut.

9
scai

Bezogen auf Jims Antwort:

Mein ~/.bashrc Enthält Folgendes:

unsort ()
{
    LC_ALL=C sort -R "[email protected]"
}

Mit GNU coreutils's sort, -R = --random-sort, Das einen zufälligen Hash für jede Zeile erzeugt und danach sortiert. Der zufällige Hash würde eigentlich nicht verwendet In einigen Gebietsschemata in einigen älteren (fehlerhaften) Versionen wird die normale sortierte Ausgabe zurückgegeben, weshalb ich LC_ALL=C gesetzt habe.


Bezogen auf Chris 'Antwort:

Perl -MList::Util=shuffle -e'print shuffle<>'

ist ein etwas kürzerer Einzeiler. (-Mmodule=a,b,c Ist eine Abkürzung für -e 'use module qw(a b c);'.)

Der Grund, warum ein einfaches -i Für das Mischen an Ort und Stelle nicht funktioniert, ist, dass Perl erwartet, dass das print in derselben Schleife stattfindet, in der die Datei gelesen wird, und print shuffle <> wird erst ausgegeben, nachdem alle Eingabedateien gelesen und geschlossen wurden.

Als kürzere Problemumgehung

Perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'

wird Dateien an Ort und Stelle mischen. (-n Bedeutet "den Code in eine while (<>) {...} -Schleife einschließen; BEGIN{undef$/} Bewirkt, dass Perl Dateien nacheinander anstelle von Zeilen nacheinander bearbeitet." und split/^/m wird benötigt, weil $_=<> implizit mit einer ganzen Datei anstelle von Zeilen gemacht wurde.)

5
ephemient

Wenn ich coreutils mit homebrew installiere

brew install coreutils

shuf wird als n verfügbar.

3
John McDonnell

Mac OS X mit DarwinPorts:

Sudo port install unsort
cat $file | unsort | ...
1
Coroos

FreeBSD hat ein eigenes Zufallsprogramm:

cat $file | random | ...

Es befindet sich in/usr/games/random. Wenn Sie also noch keine Spiele installiert haben, haben Sie Pech.

Sie können Ports wie textproc/Rand oder textproc/msort installieren. Diese sind möglicherweise unter Linux und/oder Mac OS X verfügbar, wenn die Portabilität von Bedeutung ist.

1
Coroos