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