Làm thế nào tôi có thể thêm chuỗi ngẫu nhiên cho mỗi dòng?


12

Tôi đang cố gắng thêm chuỗi ngẫu nhiên cho mỗi dòng trong khi chạy:

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

Trước đó, chuỗi ngẫu nhiên được tạo:

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

Vấn đề là nó sẽ in cùng một chuỗi ngẫu nhiên cho mỗi dòng:

nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-

Tôi nên làm gì để có được chuỗi ngẫu nhiên khác nhau cho mỗi dòng?


Thay vì một số biến thể của tr -dc '[:alnum:]' </dev/urandom | head -c 6nó, nó sẽ đơn giản hơn và hiệu quả hơn về mặt tính toán để sử dụng pwgen -s 6 1, hoặc tốt hơn là pwgen -s 6 $(wc -l myfile)sẽ cung cấp cho bạn chính xác tất cả các chuỗi ngẫu nhiên bạn cần, trong một lần chụp.
dùng1404316

Câu trả lời:


9

Với awk system() chức năng :

Mẫu input.txt:

a
b
c

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

Đầu ra mẫu:

nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c

system(command)
Thực hiện lệnh hệ điều hành commandvà sau đó quay lại chương trình awk

https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-f ghép


Đẹp, nhưng tại sao tôi nhận được tr: write error: Broken pipe?
dùng134969

@ user134969, nó hoạt động tốt. Đảm bảo rằng bạn chưa mắc lỗi nào trong dòng lệnh
RomanPerekhrest

9

Bạn không nghĩ rằng nó hơi rõ ràng? Bạn chỉ tạo chuỗi ngẫu nhiên một lần và lưu trữ nó trong ranbiến và sử dụng nó cho tất cả các dòng!

Sử dụng getlinevào một biến từ một đường ống

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

Khi bạn sử dụng command | getline var, đầu ra của lệnh được gửi qua một đường ống đến getline()và vào biếnvar .

Cũng lưu ý khi một đường ống được mở cho đầu ra, awkhãy nhớ lệnh được liên kết với nó và ghi tiếp theo vào lệnh được gắn vào ghi trước đó. Chúng ta cần thực hiện một close()cuộc gọi rõ ràng của lệnh để ngăn chặn điều đó.

Nếu các dấu ngoặc đơn lồng nhau str_generatorgây ra sự cố, hãy thay thế bằng dấu bát phân tương đương ( \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

Chạy một phiên bản tr -dc '[:alnum:]' </dev/urandom | head -c 6cho mỗi dòng đầu vào sẽ phản tác dụng, bạn sẽ làm tốt hơn:

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

Nếu đầu vào của bạn không chứa backticks cũng không có dấu ngoặc kép duy nhất, bạn cũng có thể sử dụng m4's mkstemp():

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

4

Biến thể này trên một vài câu trả lời khác thực hiện việc tạo chuỗi ngẫu nhiên bên ngoài 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

Các tr+ foldđường ống tạo ra một dòng bất tận của ngẫu nhiên chuỗi sáu nhân vật trên đầu vào tiêu chuẩn của awk. awksẽ bỏ qua đầu vào tiêu chuẩn nếu tên tệp được cung cấp, vì vậy các chuỗi ngẫu nhiên này được đọc getlinetừ /dev/stdintrong biến r. printfsau đó được sử dụng để tiền tố các dòng từ tệp với chuỗi thích hợp.

Đưa ra tập tin

123
abc
@#$

điều này có thể tạo ra

nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$


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

Yêu cầu - input.txt chỉ nên chứa một cột, nói cách khác, nó không nên có các tab hoặc khoảng trắng, vì chúng được sử dụng làm dấu tách mặc định bởi awkpastecác lệnh (chỉ ký tự tab). Nếu không, lệnh phải được sửa đổi một chút.

Lưu ý: Các Base64 bảng chữ cái chứa +/ký tự: Base64 bảng , nếu bạn muốn chỉ số và chữ cái, bạn có thể sử dụng base32lệnh - Base32 bảng chữ cái .

Đầu vào

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

=== thêm ký tự cho rõ ràng.

Đầu ra

LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.