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?
tr -dc '[:alnum:]' </dev/urandom | head -c 6
, akan lebih sederhana dan lebih efisien secara komputasi untuk digunakanpwgen -s 6 1
, atau lebih baik lagipwgen -s 6 $(wc -l myfile)
akan memberi Anda semua string acak yang Anda butuhkan, dalam satu kesempatan.Jawaban:
Dengan fungsi awk
system()
:Sampel
input.txt
:Output sampel:
https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function
sumber
tr: write error: Broken pipe
?Tidakkah Anda berpikir itu agak jelas? Anda hanya menghasilkan string acak sekali dan menyimpannya dalam
ran
variabel dan menggunakannya untuk semua baris!Menggunakan
getline
ke dalam variabel dari pipaKetika Anda menggunakan
command | getline var
, output dari perintah dikirim melalui pipa kegetline()
dan ke dalam variabelvar
.Perhatikan juga ketika sebuah pipa dibuka untuk keluaran,
awk
ingat perintah yang terkait dengannya, dan penulisan selanjutnya pada perintah ditambahkan ke tulisan sebelumnya. Kita perlu membuatclose()
panggilan perintah secara eksplisit untuk mencegahnya.Jika tanda kutip tunggal bersarang di dalam
str_generator
menyebabkan masalah, ganti dengan ekivalen oktalnya (\047
)sumber
Menjalankan satu instance
tr -dc '[:alnum:]' </dev/urandom | head -c 6
per baris input akan menjadi kontra-produktif, Anda sebaiknya melakukan:Jika masukan Anda tidak mengandung tanda kutip mundur atau tanda kutip tunggal, Anda juga bisa menggunakan
m4
'smkstemp()
:sumber
Variasi ini pada beberapa jawaban lain tidak menghasilkan generasi string acak di luar
awk
:The
tr
+fold
pipa menghasilkan seolah tak ada habisnya string enam karakter acak pada input standarawk
.awk
akan mengabaikan input standar jika nama file disediakan, jadi string acak ini dibacagetline
dari/dev/stdin
ke dalam variabelr
.printf
kemudian digunakan untuk awalan garis dari file dengan string yang sesuai.Diberikan file
ini dapat menghasilkan
sumber
Tanpa menggunakan awk sama sekali, cukup sederhana
bash
sumber
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
awk
danpaste
(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 menggunakanbase32
perintah - Base32 alfabet .Memasukkan
===
karakter ditambahkan untuk kejelasan.Keluaran
sumber