Quiero eliminar 10 líneas aleatorias de un archivo de texto que tiene 90 líneas y luego enviarlo a un nuevo archivo. He estado tratando de hacer esto usando sed, pero tengo dos problemas. Estoy usando:
sed -i $((1 + RANDOM & 90))d input.txt > output.txt
y luego ejecutar el comando 10 veces (¡supongo que hay una mejor manera de hacer esto!)
El primer problema que tengo es que me sale el error:
sed:-e expresión #1, carácter 2:uso no válido de la dirección de línea 0
Supongo que esto tiene algo que ver con el hecho de que es posible que ya haya eliminado la línea 1 y lo esté intentando de nuevo.
El segundo problema es que a veces no se escribe nada en el archivo de salida, aunque funcionaba antes de usar el mismo comando.
Respuesta aceptada:
Probablemente querías usar RANDOM % 90
en lugar de &
. De ahí provienen los ceros (eliminar la línea 1 está bien, en la próxima ejecución, las líneas se numerarán 1 .. 89).
Sin embargo, hay un problema:la fórmula podría generar el mismo número varias veces. Para evitar eso, usa un enfoque diferente:baraja los números y elige los primeros diez:
shuf -i1-90 -n10 | sed 's/$/d/' | sed -f- input > output
Si no te gusta sed
generando un sed
secuencia de comandos, puede usar printf
, también:
sed -f <( printf %dd; $(shuf -i1-90 -n10) ) input > output