Her satır için nasıl rastgele dize ekleyebilirim?


12

Çalışırken her satır için rastgele dize eklemeye çalışıyorum:

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

Bundan önce rastgele dize oluşturulur:

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

Sorun, her satır için aynı rastgele dizeyi basmasıdır:

nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-

Her satır için farklı rastgele dizeler elde etmek için ne yapmalıyım?


Bazı varyasyonları yerine, tr -dc '[:alnum:]' </dev/urandom | head -c 6kullanımı daha basit ve daha hesaplamalı olarak verimli pwgen -s 6 1veya daha iyi olur, ancak pwgen -s 6 $(wc -l myfile)ihtiyacınız olan tüm rastgele dizeleri tek bir çekimde verir.
user1404316

Yanıtlar:


9

İle awk system() fonksiyonu:

Örnek input.txt:

a
b
c

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

Örnek çıktı:

nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c

system(command)
İşletim sistemi komutunu yürütün ve commandawk programına dönün

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


Güzel, ama neden alıyorum tr: write error: Broken pipe?
Kullanıcı134969

@ user134969, iyi çalışıyor. Komut satırında herhangi bir hata yapmadığınızdan emin olun
RomanPerekhrest

9

Biraz açık olduğunu düşünmüyor musun? Sadece bir kez rastgele dize üretiyorsunuz ve randeğişkente saklıyorsunuz ve tüm satırlar için kullanıyorsunuz!

getlineBir borudan bir değişkene kullanma

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

Kullandığınızda command | getline var, komutun çıktısı bir borudan getline()değişkene ve değişkene gönderilir var.

Ayrıca, bir boru çıkış için açıldığında, awkonunla ilişkili komutu hatırlar ve komutun sonraki yazmalarına önceki yazmalara eklenir. Bunu close()önlemek için komutun açıkça çağrılması gerekir .

İçindeki iç içe yerleştirilmiş tek tırnaklar str_generatorsoruna neden oluyorsa, sekizli eşdeğeri ( \047) ile değiştirin

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

tr -dc '[:alnum:]' </dev/urandom | head -c 6Her girdi satırı için bir örnek çalıştırmak karşı üretken olacaktır, şunları yapmanız daha iyi olur:

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

Girişinizde geriye dönük veya tek tırnak işareti yoksa, m4's mkstemp():

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

4

Diğer birkaç cevaptaki bu varyasyon, rastgele dize oluşturma işlemini aşağıdakilerin dışında yapar 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

tr+ foldBoru hattı standart girişinde rastgele altı karakterli dizeleri sonsuz bir akışı üretir awk. awkBir dosya adı sağlanırsa bu rastgele dizeleri tarafından okunur, böylece standart girişini görmez getlineden /dev/stdindeğişkene r. printfdaha sonra uygun dizeyle dosyadaki satırların önüne önek eklemek için kullanılır.

Dosya verildi

123
abc
@#$

bu üretebilir

nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$


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

Gereksinimler - input.txt yalnızca bir sütun içermelidir, diğer bir deyişle, sekmeler veya boşluklar içermemelidir, çünkü awkve paste(yalnızca sekme karakteri) komutlarıyla varsayılan ayırıcı olarak kullanılırlar . Aksi takdirde, komutun biraz değiştirilmesi gerekir.

Not: Base64 alfabesi içerir +ve /karakterler: Base64 tablo yalnızca sayılar ve harfler istiyorsanız, kullanabileceğiniz base32komutu - Base32 alfabe .

Giriş

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

=== netlik için karakterler eklendi.

Çıktı

LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.