Ich möchte 10 zufällige Zeilen aus einer Textdatei mit 90 Zeilen löschen und diese dann in eine neue Datei ausgeben. Ich habe versucht, dies mit sed zu tun, aber ich habe zwei Probleme. Ich verwende:
sed -i $((1 + RANDOM & 90))d input.txt > output.txt
und dann den Befehl 10 Mal ausführen (ich nehme an, es gibt einen besseren Weg, dies zu tun!)
Das erste Problem, das ich habe, ist, dass ich den Fehler erhalte:
sed:-e Ausdruck #1, Zeichen 2:Ungültige Verwendung der Zeilenadresse 0
Ich nehme an, dass dies damit zu tun hat, dass Zeile 1 möglicherweise bereits gelöscht wurde und es erneut versucht wird.
Das zweite Problem ist, dass manchmal nichts in die Ausgabedatei geschrieben wird, obwohl es vor der Verwendung desselben Befehls funktioniert hat.
Akzeptierte Antwort:
Wahrscheinlich wollten Sie RANDOM % 90
verwenden statt &
. Daher kommen die Nullen (Zeile 1 löschen ist OK, beim nächsten Durchlauf werden die Zeilen von 1 .. 89 durchnummeriert).
Es gibt jedoch ein Problem:Die Formel könnte mehrmals dieselbe Zahl ergeben. Um dies zu verhindern, verwenden Sie einen anderen Ansatz:Mischen Sie die Zahlen und wählen Sie die ersten zehn aus:
shuf -i1-90 -n10 | sed 's/$/d/' | sed -f- input > output
Wenn Sie sed
nicht mögen Generieren eines sed
-Skript können Sie printf
verwenden , auch:
sed -f <( printf %dd; $(shuf -i1-90 -n10) ) input > output