Saya ingin menghapus 10 baris acak dari file teks yang memiliki 90 baris dan kemudian menampilkan ini ke file baru. Saya sudah mencoba melakukan ini menggunakan sed, tetapi saya memiliki dua masalah. Saya menggunakan:
sed -i $((1 + RANDOM & 90))d input.txt > output.txt
dan kemudian menjalankan perintah 10 kali (saya berasumsi ada cara yang lebih baik untuk melakukan ini!)
Masalah pertama yang saya miliki adalah saya mendapatkan kesalahan:
sed:-e ekspresi #1, karakter 2:penggunaan alamat baris yang tidak valid 0
Saya berasumsi ini ada hubungannya dengan fakta bahwa itu mungkin telah menghapus baris 1 dan sedang mencoba lagi.
Masalah kedua adalah terkadang tidak ada yang ditulis ke file output, meskipun itu berfungsi sebelum menggunakan perintah yang sama.
Jawaban yang Diterima:
Anda mungkin ingin menggunakan RANDOM % 90
daripada &
. Dari situlah angka nol berasal (menghapus baris 1 tidak apa-apa, pada putaran berikutnya, garis akan diberi nomor 1 .. 89).
Namun, ada masalah:Rumusnya bisa menghasilkan angka yang sama beberapa kali. Untuk mencegahnya, gunakan pendekatan yang berbeda:acak angka dan pilih sepuluh yang pertama:
shuf -i1-90 -n10 | sed 's/$/d/' | sed -f- input > output
Jika Anda tidak suka sed
menghasilkan sed
skrip, Anda dapat menggunakan printf
, juga:
sed -f <( printf %dd; $(shuf -i1-90 -n10) ) input > output