আমি কীভাবে প্রতিটি লাইনের জন্য এলোমেলো স্ট্রিং যুক্ত করতে পারি?


12

আমি চলার সময় প্রতিটি লাইনের জন্য এলোমেলো স্ট্রিং যুক্ত করার চেষ্টা করছি:

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

তার আগে, এলোমেলো স্ট্রিং উত্পন্ন হয়:

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

সমস্যাটি হ'ল এটি প্রতিটি লাইনের জন্য একই র্যান্ডম স্ট্রিংটি মুদ্রণ করবে:

nameGQz3Ek-
nameGQz3Ek-
nameGQz3Ek-

প্রতিটি লাইনের জন্য আলাদা এলোমেলো স্ট্রিং পেতে আমার কী করা উচিত?


কিছু পরিবর্তনের পরিবর্তে tr -dc '[:alnum:]' </dev/urandom | head -c 6, এটি ব্যবহার করতে সহজ এবং আরও গণনামূলকভাবে দক্ষ হবে pwgen -s 6 1, বা আরও ভাল pwgen -s 6 $(wc -l myfile)আপনাকে একটি শটটিতে আপনার প্রয়োজনীয় সমস্ত র্যান্ডম স্ট্রিং দেবে।
ব্যবহারকারী 1404316

উত্তর:


9

সঙ্গে awk system() ফাংশন:

নমুনা input.txt:

a
b
c

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

নমুনা আউটপুট:

nameSDbQ7T-a
nameAliHY0-b
nameDUGP2S-c

system(command)
অপারেটিং সিস্টেম কমান্ড কার্যকর করুন commandএবং তারপরে awk প্রোগ্রামে ফিরে আসুন

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


ভাল লাগছে তবে কেন পাচ্ছি tr: write error: Broken pipe?
ব্যবহারকারী 134969

@ ব্যবহারকারী 134969, এটি ভাল কাজ করে। নিশ্চিত হয়ে নিন যে আপনি কমান্ড লাইনে কোনও ত্রুটি করেন নি
রোমানপেরেখারেস্ট

9

আপনি কি এর বিট সুস্পষ্ট মনে করেন না? আপনি একবার মাত্র এলোমেলো স্ট্রিং তৈরি করছেন এবং এটিকে ranভেরিয়েবলে সংরক্ষণ করছেন এবং এটি সমস্ত লাইনের জন্য ব্যবহার করছেন!

getlineপাইপ থেকে ভেরিয়েবল ব্যবহার করে Using

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

আপনি যখন ব্যবহার করবেন তখন command | getline varকমান্ডের আউটপুটটি পাইপের মাধ্যমে getline()ভেরিয়েবলটিতে এবং প্রেরণ করা হয় var

নোটটি যখন আউটপুট দেওয়ার জন্য খোলা হয়, awkতার সাথে যুক্ত কমান্ডটি স্মরণ করে এবং পরবর্তী কমান্ডে লেখাগুলি পূর্ববর্তী লেখাগুলিতে যুক্ত হয়। close()এটি রোধ করতে আমাদের কমান্ডের একটি সুস্পষ্ট কল করতে হবে।

যদি নেস্টেড সিঙ্গল-কোটগুলি str_generatorসমস্যা তৈরি করে থাকে তবে এর অষ্টাল সমতুল্য ( \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

tr -dc '[:alnum:]' </dev/urandom | head -c 6প্রতি লাইন ইনপুটটির একটি উদাহরণ চালানো প্রতি-উত্পাদনশীল হবে, আপনি আরও ভাল করছেন:

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

আপনার ইনপুট ব্যাকটিক কিংবা একক উদ্ধৃতি ধারণ করে না, তাহলে আপনি ব্যবহার করতে পারে m4'র mkstemp():

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

4

অন্যান্য উত্তরগুলির কয়েকটিতে এই প্রকরণটি এর বাইরে এলোমেলো স্ট্রিং উত্পাদন করে 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+ + foldপাইপলাইন মান ইনপুটের র্যান্ডম ছয়-অক্ষর স্ট্রিং একটি অবিরাম প্রবাহ উত্পন্ন awkawkযদি কোনও ফাইলের নাম সরবরাহ করা হয় তবে স্ট্যান্ডার্ড ইনপুট উপেক্ষা করবে, সুতরাং এই এলোমেলো স্ট্রিংগুলি ভেরিয়েবলের মধ্যে getlineথেকে পড়তে হবে । তারপরে উপযুক্ত স্ট্রিং সহ ফাইল থেকে লাইনগুলি উপসর্গ করতে ব্যবহৃত হয়।/dev/stdinrprintf

ফাইল দেওয়া

123
abc
@#$

এটি উত্পাদন করতে পারে

nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$

1

খালি ব্যবহার না করে, সহজ সরল just bash

while read line; do
    printf "name%s-%s\n" \
        "$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
        "$line"
done <myfile

1
এটির সাথে সমস্যাটি হ'ল আপনি ফাইল থেকে পড়া ডেটাটি দূষিত করতে পারেন। দেখুন unix.stackexchange.com
জিজ্ঞাসা /

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

প্রয়োজনীয়তা - ইনপুট.টিএসটিএস্টটিতে কেবল একটি কলাম থাকা উচিত, অন্য কথায় এটিতে ট্যাব বা স্পেস থাকা উচিত নয়, কারণ তারা awkএবং paste(কেবলমাত্র ট্যাব অক্ষর) কমান্ড দ্বারা ডিফল্ট বিভাজক হিসাবে ব্যবহৃত হয়েছিল । অন্যথায়, কমান্ডটি কিছুটা পরিবর্তন করতে হবে।

নোট: দ্য করুন Base64- বর্ণমালা রয়েছে +এবং /অক্ষর: করুন Base64- টেবিল , যদি তোমরা সংখ্যা ও অক্ষর চান, আপনি ব্যবহার করতে পারেন base32কমান্ড - Base32 বর্ণমালা

ইনপুট

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

=== স্বচ্ছতার জন্য অক্ষর যুক্ত করা হয়েছে।

আউটপুট

LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.