Bagaimana saya bisa secara acak mengganti string tertentu dalam satu file teks dengan string dari file lain? Sebagai contoh:
file1.txt(file has more than 200 lines):
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
file2.txt(file has 10-20 lines):
@adress1.com
@adress2.com
@adress3.com
@adress4.com
@adress5.com
output.txt:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
command-line
text-processing
elanozturk
sumber
sumber
Jawaban:
Jika Anda benar - benar menginginkan pilihan acak, maka inilah salah satu cara menggunakan
awk
:OTOH jika Anda ingin permutasi acak alamat, saya akan menyarankan sesuatu seperti
sumber
paste
tetapi tidak terpikir oleh sayacut
untuk menghapus bidang yang tidak cocok.<(sort -R file2.txt)
kita dapat menggunakan sesuatu seperti<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
- yang dapat membelokkan keacakan dalam mendukung garis lebih dekat ke bagian atas file2.Anda dapat menerapkan algoritma ini:
file2.txt
ke sebuah arrayfile1.txt
:Seperti ini:
(Terima kasih khusus kepada @GlennJackman dan @dessert untuk perbaikannya.)
sumber
mapfile -t addresses < file2.txt
- menggunakancat
seperti itu subjek Anda untuk pemisahan kata dan ekspansi nama file.file1.txt
jika file ini tidak diakhiri dengan baris kosong (maaf, tidak dapat menguji saat ini)? Jika tidak saya sarankanwhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, lihat Baca file per baris yang menetapkan nilai ke variabel · SO .Anda dapat menggunakan
shuf
(Anda mungkin perlusudo apt install shuf
) untuk mengocok baris file kedua dan kemudian menggunakannya untuk mengganti:shuf
cukup mengacak urutan jalur inputnya. Theawk
perintah sana pertama akan membaca semua file1 (NR==FNR
hanya akan menjadi kenyataan sedangkan file pertama adalah menjadi read), dan menyimpan kolom kedua (bidang didefinisikan oleh@
, jadi ini adalah domain) dalam array asosiatifa
yang nilainya adalah domain dan kuncinya adalah nomor baris. Kemudian, ketika kita sampai ke file berikutnya, itu hanya akan mencetak apa pun yang disimpan dia
untuk nomor baris ini, bersama dengan apa yang ada di file 2 untuk nomor baris yang sama.Perhatikan bahwa ini mengasumsikan kedua file memiliki jumlah baris yang persis sama dan sebenarnya tidak "acak", karena tidak akan membiarkan apa pun diulang. Tapi sepertinya itu yang ingin Anda tanyakan.
sumber
Solusi Python 2.7 dan 3
Solusi ini menggantikan kemunculan pertama dari string tunggal yang diberikan sewenang-wenang ("jarum") di setiap baris file input dengan string setiap kali dipilih secara acak dari serangkaian garis dari daftar string pengganti.
Seharusnya hampir sepele untuk menjangkar jarum ke awal atau akhir string atau menggunakan ekspresi reguler sama sekali.
Pemakaian
Contoh:
atau
sumber
Berikut cara perl:
sumber
Solusi bash lain. Ini menggunakan fitur pengganti string bawaan bash. Ini juga mengasumsikan hanya
file2.txt
berisi string pengganti. Jika tidak, mereka dapat difilter terlebih dahulu menggunakangrep -o <replace> file2.txt
Dengan
shuf
Tanpa
shuf
(hampir murnibash
)Di sini kita harus membuat fungsi pertama yang meniru
shuf
seperti ituMaka itu mirip
Uji:
sumber