আমার মতো স্ট্রিং রয়েছে: dog cat bird whale
এবং আমি পেতে চাই dog dog cat cat bird bird whale whale
সমস্ত শব্দ একই লাইনে আছে। কোন ধারণা?
আমার মতো স্ট্রিং রয়েছে: dog cat bird whale
এবং আমি পেতে চাই dog dog cat cat bird bird whale whale
সমস্ত শব্দ একই লাইনে আছে। কোন ধারণা?
উত্তর:
সমাধানের পরিবারে যুক্ত হচ্ছে :-)।
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
এক্সিকিউটেবল এবং এখনই করুন:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
বিকল্প হিসাবে শেল ফাংশন হিসাবে, যেমন একটি স্ক্রিপ্ট মধ্যে পুনরায় ব্যবহারযোগ্য:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
যা তখন সরাসরি চালানো যেতে পারে যেখানে সংজ্ঞায়িত করা হয়
duplicator dog cat bird whale
আপনি ব্যবহার করতে পারেন sed
:
sed -r 's/(\S+)/\1 \1/g' filename
আপনি যদি ফাইলটিতে স্থান পরিবর্তনগুলি সংরক্ষণ করতে চান তবে বলুন:
sed -i -r 's/(\S+)/\1 \1/g' filename
আপনি এটি ব্যবহার করতে পারেন perl
:
perl -M5.10.0 -ne 'say join " ", map{$_, $_} split " ";' filename
( -i
স্থানটিতে থাকা ফাইলের পরিবর্তনগুলি সংরক্ষণ করার জন্য বিকল্পটি যুক্ত করুন ))
অথবা, টেরডনের পরামর্শ অনুসারে :
perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' filename
থেকে উদ্ধৃতি perlvar
:
@F
অ্যারেতে
@F
অটোস্প্লিট মোড চালু হওয়ার সময় পঠিত প্রতিটি লাইনের ক্ষেত্র থাকে।-a
স্যুইচ জন্য perlrun দেখুন । এই অ্যারেটি প্যাকেজ-নির্দিষ্ট এবং এর অধীনে চলার সময় প্যাকেজ প্রধানতে না থাকলে অবশ্যই তা ঘোষিত বা পূর্ণ প্যাকেজের নাম দিতে হবেstrict 'vars'
।
sed -r 's/\S+/& &/g'
।
-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
awk/gawk
উত্তর ছাড়া কী হবে :
$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }}' <<<"dog cat bird whale"
dog dog cat cat bird bird whale whale
যদি একটি সমাপ্তি নিউলাইন গুরুত্বপূর্ণ:
$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }} END{print ""}' <<<"dog cat bird whale"
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
, আইএমএইচও, আরও খাটো এবং আরও পঠনযোগ্য।
s="dog cat bird wale"
ss=$( tr ' ' '\n' <<< "$s" | sed p | tr '\n' ' ' )
echo "$ss"
dog dog cat cat bird bird wale wale
sed -n 'p;p'
- আমি ভেবেছিলাম এটি কী করছে সে সম্পর্কে এটি আরও স্বচ্ছ।
যদি আপনার স্ট্রিংটি ভেরিয়েবলের হয় তবে বলুন foo="dog cat bird whale"
, আপনি এটি করতে পারেন:
খাঁটি বাশ:
$ echo "$foo" | (read a b c d && echo "$a $a $b $b $c $c $d $d")
dog dog cat cat bird bird whale whale
ব্যাখ্যা: প্রথম বন্ধনী যাতে প্রয়োজন হয় read
এবং echo
একই subshell ঘটতে এবং সেইজন্য ভাগ ভেরিয়েবল পারেন। এগুলি ছাড়া, echo
কেবল একটি ফাঁকা রেখা মুদ্রণ করা হবে।
coreutils:
$ join -j 5 -o 1.1,1.1,1.2,1.2,1.3,1.3,1.4,1.4 <(echo $foo) <(echo)
dog dog cat cat bird bird whale whale
ব্যাখ্যা: এর -o
পতাকা join
আপনাকে আউটপুট ফর্ম্যাট সেট করতে দেয়। এখানে, আমি এটি 1 ম ফাইলের প্রথম ক্ষেত্র ( 1.1
) প্রিন্ট করতে বলছি, তার পরে 1 ম ফাইলের দ্বিতীয় ক্ষেত্র ( 1.2
) ইত্যাদি That এভাবে 1 ম ফাইলের প্রতিটি ক্ষেত্র দু'বার মুদ্রিত হবে। তবে, একটি সাধারণ ক্ষেত্রে দুটি ইনপুট লাইনে join
যোগদানের জন্য, ভালভাবে ডিজাইন করা হয়েছে । সুতরাং, আমি এটিকে একটি ফাঁকা রেখা ( ) দিয়েছি এবং তারপরে এড়িয়ে চলেছি। সংযুক্ত ক্ষেত্রটি সেট করে, এটি বিদ্যমান না করে এমন একটিতে সেট করে (5 তম) পুরো লাইনটি মুদ্রণ করে।<(echo)
-j
join
যদি আপনি হোয়াইট স্পেস বা ইনপুট অর্ডার সম্পর্কে চিন্তা না করেন তবে আপনি এটি করতে পারেন
$ paste <(echo $foo) <(echo $foo)
dog cat bird wale dog cat bird wale
পার্ল 1:
$ echo $foo | perl -lane 'push @k, $_,$_ for @F; print "@k"'
dog dog cat cat bird bird whale whale
ব্যাখ্যা:
-l: adds a newline to each print call (among other things)
-a: turns on field splitting, fields are saved as @F
-n: process input line by line
-e: give a script as a command line parameter.
উপরের স্ক্রিপ্টটি প্রতিটি ক্ষেত্রটি (থেকে @F
) অ্যারেতে দু'বার সংরক্ষণ করবে @k
এবং তারপরে মুদ্রণ করবে @k
। আপনার যদি পিছনের নতুন লাইনের প্রয়োজন না হয় তবে আপনি সহজ করতে পারেন
$ echo $foo | perl -ane 'print " $_ $_" for @F'
পার্ল 2:
$ echo $foo | perl -0040 -pne 'print "$_"' | paste - -
dog dog cat cat bird bird whale whale
ব্যাখ্যা:-0
বিকল্প ইনপুট রেকর্ড বিভাজক সেট করে (ক হেক্সাডেসিমেল বা অকট্যাল সংখ্যা হিসাবে দেখতে এখানে ধর্মান্তর জন্য)। এখানে আমি এটি অষ্টালে সেট করছি 040
যা একটি স্থান। -p
তোলে perl
প্রতিটি ইনপুট "লাইনের" মুদ্রণ এবং যেহেতু আমরা স্থান রেকর্ড বিভাজক সেট করেছেন, লাইন এখন শূণ্যস্থান দ্বারা, তাই প্রতিটি ক্ষেত্রে দুইবার ছাপা হয় সংজ্ঞায়িত করা হয়।
awk
:
$ echo $foo | awk '{for(i=1;i<=NF;i++){$i=$i" "$i;} 1;}'
dog dog cat cat bird bird whale whale
ব্যাখ্যা: NF
ক্ষেত্রের সংখ্যা, সুতরাং উপরের স্ক্রিপ্টটি প্রতিটি ক্ষেত্রের মধ্যে দিয়ে যায় এবং এটি নিজের মধ্যে সংযোজন করে। এটি হয়ে গেলে, আমরা লাইনটি মুদ্রণ করি ( 1;
প্রিন্টের জন্য কেবল শর্টহ্যান্ড)।
এখন একটি python
উত্তরের জন্য:
কমান্ড লাইন থেকে:
$ python -c "import sys; s=sys.argv[1:]; print(' '.join(j for i in zip(s,s)for j in i));" dog cat bird whale
স্টিডিন থেকে:
$ python -c "s=input().split(); print(' '.join(j for i in zip(s,s)for j in i));" <<<"dog cat bird whale"
উভয় ক্ষেত্রে ফলাফল:
dog dog cat cat bird bird whale whale
আর একটি পদ্ধতি, কেবল ব্যাশ বিল্টিন ব্যবহার করে
$ string="dog cat bird whale"
$ twix() { while [[ ! -z $1 ]]; do printf "%s %s " $1 $1; shift; done; }
$ twix $string
dog dog cat cat bird bird whale whale
আমি উপরের উত্তরের সাথে তুলনা করে কোনও সুবিধা দেখছি না, কেবল কিছুটা ভিন্ন উপায় দেখানোর জন্য, যা কিছু উদ্দেশ্যে উপযুক্ত হতে পারে।
echo
বাশ (পরীক্ষা type echo
) -এ একটি শেল বিল্টিনও ।