GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie lösche ich mehrere zufällige Zeilen aus einer Textdatei mit Sed?

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

Linux
  1. Wie lösche ich die ersten/letzten 'n' Zeilen aus der Befehlsausgabe in der Shell?

  2. Wie fügt man mehrere Zeilen an eine Datei an?

  3. Wie entferne ich Zeilenumbrüche aus einer Textdatei?

  4. Entfernt Vorkommen von Zeichenketten in Textdatei

  5. Löschen Sie leere Zeilen mit sed

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

So löschen Sie leere Zeilen in Dateien mit Grep, Sed und Awk

So löschen Sie mehrere Zeilen in Vim

Unix Sed Tutorial:Löschen Sie Dateizeilen mit Adresse und Mustern

Unix Sed Tutorial:So schreiben Sie mit Sed in eine Datei

So löschen Sie ausgewählten Text im vi-Editor