GNU/Linux >> Znalost Linux >  >> Linux

Jak odstranit více náhodných řádků z textového souboru pomocí Sed?

Chci odstranit 10 náhodných řádků z textového souboru, který má 90 řádků, a poté to vypsat do nového souboru. Zkoušel jsem to udělat pomocí sed, ale mám dva problémy. Používám:

sed -i $((1 + RANDOM & 90))d input.txt > output.txt

a poté 10krát spustit příkaz (předpokládám, že existuje lepší způsob, jak to udělat!)

První problém, který mám, je, že se mi zobrazuje chyba:

sed:-e výraz #1, char 2:neplatné použití adresy řádku 0

Předpokládám, že to má něco společného s tím, že už mohl smazat řádek 1 a zkouší to znovu.

Druhým problémem je, že někdy se do výstupního souboru nic nezapíše, i když to fungovalo před použitím stejného příkazu.

Přijatá odpověď:

Pravděpodobně jste chtěli použít RANDOM % 90 spíše než & . Odtud pocházejí nuly (smazání řádku 1 je v pořádku, při příštím spuštění budou řádky očíslovány 1...89).

Je tu však problém:Vzorec může vygenerovat stejné číslo několikrát. Abyste tomu zabránili, použijte jiný přístup:zamíchejte čísla a vyberte prvních deset:

shuf -i1-90 -n10 | sed 's/$/d/' | sed -f- input > output

Pokud se vám nelíbí sed generování sed skript, můžete použít printf , také:

sed -f <( printf %dd;  $(shuf -i1-90 -n10) ) input > output

Linux
  1. Jak odstranit první/poslední „n“ řádky z výstupu příkazu v prostředí Shell?

  2. Jak odstranit prvních N řádků souboru Ascii pomocí příkazů Shell?

  3. Jak odstraním nové řádky z textového souboru?

  1. Odstraňte prázdné řádky pomocí sed

  2. Odstraňte liché nebo sudé řádky z textového souboru

  3. Jak vložím text do 1. řádku souboru pomocí sed?

  1. Jak připojit více řádků k souboru?

  2. Jak odstranit všechny řádky souboru ve Vimu

  3. Odstraňte výskyty řetězce v textovém souboru