Bagaimana saya bisa menambahkan string acak untuk setiap baris?


12

Saya mencoba menambahkan string acak untuk setiap baris saat menjalankan:

awk '{print "name" "'$ran'" "-"$0}' 'myfile'

Sebelum itu, string acak dihasilkan:

ran="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"

Masalahnya adalah ia akan mencetak string acak yang sama untuk setiap baris:

nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-

Apa yang harus saya lakukan untuk mendapatkan string acak yang berbeda untuk setiap baris?


Alih-alih beberapa variasi tr -dc '[:alnum:]' </dev/urandom | head -c 6, akan lebih sederhana dan lebih efisien secara komputasi untuk digunakan pwgen -s 6 1, atau lebih baik lagi pwgen -s 6 $(wc -l myfile)akan memberi Anda semua string acak yang Anda butuhkan, dalam satu kesempatan.
user1404316

Jawaban:


9

Dengan fungsi awk system() :

Sampel input.txt:

a
b
c

awk '{ 
         printf "name";
         system("tr -dc \047[:alnum:]\047 </dev/urandom | head -c6");
         printf "-%s\n", $0
     }' input.txt

Output sampel:

nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c

system(command)
Jalankan perintah sistem operasi commanddan kemudian kembali ke program awk

https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function


Bagus, tapi mengapa saya mendapatkannya tr: write error: Broken pipe?
user134969

@ user134969, ini berfungsi dengan baik. Pastikan Anda belum membuat kesalahan di baris perintah
RomanPerekhrest

9

Tidakkah Anda berpikir itu agak jelas? Anda hanya menghasilkan string acak sekali dan menyimpannya dalam ranvariabel dan menggunakannya untuk semua baris!

Menggunakan getlineke dalam variabel dari pipa

awk '{
     str_generator = "tr -dc '[:alnum:]' </dev/urandom | head -c 6"
     str_generator | getline random_str
     close(str_generator)
     print "name " random_str " - " $0
}' file

Ketika Anda menggunakan command | getline var, output dari perintah dikirim melalui pipa ke getline()dan ke dalam variabel var.

Perhatikan juga ketika sebuah pipa dibuka untuk keluaran, awkingat perintah yang terkait dengannya, dan penulisan selanjutnya pada perintah ditambahkan ke tulisan sebelumnya. Kita perlu membuat close()panggilan perintah secara eksplisit untuk mencegahnya.

Jika tanda kutip tunggal bersarang di dalam str_generatormenyebabkan masalah, ganti dengan ekivalen oktalnya ( \047)

awk '{
     str_generator = "tr -dc \047[:alnum:]\047 </dev/urandom | head -c 6"
     str_generator | getline random_str
     close(str_generator)
     print "name " random_str " - " $0
}' file

8

Menjalankan satu instance tr -dc '[:alnum:]' </dev/urandom | head -c 6per baris input akan menjadi kontra-produktif, Anda sebaiknya melakukan:

<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
  {rng | getline r; print "name"r"-"$0}'

Jika masukan Anda tidak mengandung tanda kutip mundur atau tanda kutip tunggal, Anda juga bisa menggunakan m4's mkstemp():

<input sed "s/.*/mkstemp(name)\`&'/" | m4

4

Variasi ini pada beberapa jawaban lain tidak menghasilkan generasi string acak di luar awk:

LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6 |
awk '{ getline r <"/dev/stdin"; printf("name%s-%s\n", r, $0) }' file

The tr+ foldpipa menghasilkan seolah tak ada habisnya string enam karakter acak pada input standar awk. awkakan mengabaikan input standar jika nama file disediakan, jadi string acak ini dibaca getlinedari /dev/stdinke dalam variabel r. printfkemudian digunakan untuk awalan garis dari file dengan string yang sesuai.

Diberikan file

123
abc
@#$

ini dapat menghasilkan

nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$


0
paste <(base64 -w6 /dev/urandom) input.txt | awk 'NF==2{print $1$2} NF!=2{exit}'

Persyaratan - input.txt harus berisi hanya satu kolom, dengan kata lain, itu tidak boleh memiliki tab atau spasi, karena mereka digunakan sebagai pemisah default dengan awkdan paste(hanya karakter tab) perintah. Jika tidak, perintah harus diubah sedikit.

Catatan: The Base64 alfabet mengandung +dan /karakter: meja Base64 , jika Anda ingin hanya angka dan huruf, Anda dapat menggunakan base32perintah - Base32 alfabet .

Memasukkan

===my_line_a
===my_line_b
===my_line_c
===my_line_d
===my_line_e

=== karakter ditambahkan untuk kejelasan.

Keluaran

LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.