বাশ স্ক্রিপ্ট এক লাইনে প্রতিটি শব্দ পুনরাবৃত্তি?


13

আমার মতো স্ট্রিং রয়েছে: dog cat bird whale

এবং আমি পেতে চাই dog dog cat cat bird bird whale whale

সমস্ত শব্দ একই লাইনে আছে। কোন ধারণা?

উত্তর:


28

সমাধানের পরিবারে যুক্ত হচ্ছে :-)।

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

4
আমি শেল পদ্ধতির সরলতা পছন্দ করি।
হেন্ক ল্যাঙ্গভেল্ড

ভাল আমি সত্যিই এই সমাধানটির সরলতা পছন্দ করি
ক্রিশ্চিয়ান

আমি প্রথম দু'পক্ষের চেয়ে ভাল ways
জো

21

আপনি ব্যবহার করতে পারেন 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'


4
অপেক্ষাকৃত ছোট: sed -r 's/\S+/& &/g'
সিআরস

2
এটি কোনও বাশ স্ক্রিপ্ট নয়। কিছু কমান্ড (এমনকি একটি শ্যাশ শেল থেকে) শুরু করা কোনও বাশ স্ক্রিপ্টের সমন্বিত নয়।
পিটার মর্টেনসেন

4
@ পিটারমোরটেনসেন আপনি প্রযুক্তিগতভাবে সঠিক (সঠিক ধরণের সঠিক), তবে কার্যত ব্যাশ ইনস্টল করা প্রতিটি সিস্টেমে সেড এবং অ্যাজকের মতো স্ট্যান্ডার্ড ইউনিক্স সরঞ্জাম থাকবে। শেল স্ক্রিপ্টিংয়ের পুরো বিন্দু (ভাল, এর বিন্দুর একটি বড় অংশ) হ'ল সঠিক জায়গায় কমান্ডগুলি নির্দেশ করা।
অশুচি

3
@ পিটারমোরটেনসেন এটি ভুল। একটি বাশ স্ক্রিপ্ট বাহ্যিক কমান্ড কল করতে পারে। একটি বাশ স্ক্রিপ্টটি শেবাং লাইন দিয়ে শুরু করা উচিত, তবে এটি কঠোরভাবে প্রয়োজনীয় নয়। প্রশ্নটি সুনির্দিষ্ট করে নি যে বাশ স্ক্রিপ্টটি বাহ্যিক কমান্ডগুলি কল করতে পারে না (প্রায়শই "খাঁটি বাশ স্ক্রিপ্ট" নামে পরিচিত)।
গিলস'স'- দুষ্ট হওয়া বন্ধ করুন '

2
ভাল পার্ল ট্রিক। আপনি এটিকে আরও সংক্ষিপ্ত করে তুলতে পারেন -a:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
টেরডন

4

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"

আমার প্রথম অংশ ডাউন। শুধু কৌতূহলী, কেন? স্ক্রিপ্টে কিছু ভুল আছে? বা আরও সংক্ষিপ্ত সংস্করণ?
ব্যবহারকারী19087

আমার ডাউনভোট নয় for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;, আইএমএইচও, আরও খাটো এবং আরও পঠনযোগ্য।
ধনী

এর সাথে তর্ক করা শক্ত, তাই আমি পদ্ধতির পরিবর্তন না করেই আমার উত্তরটি সরল করে এবং সংক্ষিপ্ত করে রেখেছি (এখন সূচকগুলি ইনটগুলিতে পরিণত করার সুবিধা গ্রহণ করে)। আশা করি এটি এখন আরও পরিষ্কার হয়ে গেছে।
ব্যবহারকারী19087

1
এটি কোনও বাশ স্ক্রিপ্ট নয়। কিছু কমান্ড (এমনকি একটি শ্যাশ শেল থেকে) শুরু করা কোনও বাশ স্ক্রিপ্টের সমন্বিত নয়।
পিটার মর্টেনসেন

যদিও এটি কোনও স্ক্রিপ্টে রাখা তুচ্ছ কাজ।
কেভিন

3
s="dog cat bird wale"
ss=$( tr ' ' '\n' <<< "$s" | sed p | tr '\n' ' ' )
echo "$ss"
dog dog cat cat bird bird wale wale 

1
আমি লেখার বিষয়ে ভেবেছিলাম sed -n 'p;p'- আমি ভেবেছিলাম এটি কী করছে সে সম্পর্কে এটি আরও স্বচ্ছ।
গ্লেন জ্যাকম্যান 19

1
আপনার উত্তরটি যুক্ত করা উচিত!
টেরডন

1

যদি আপনার স্ট্রিংটি ভেরিয়েবলের হয় তবে বলুন 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)-jjoin

    যদি আপনি হোয়াইট স্পেস বা ইনপুট অর্ডার সম্পর্কে চিন্তা না করেন তবে আপনি এটি করতে পারেন

    $ 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;প্রিন্টের জন্য কেবল শর্টহ্যান্ড)।


0

এখন একটি 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

0

সামান্য উপরে শীর্ষ, কিন্তু একটি haskellউত্তর:

$ ghc -e "getLine >>= putStrLn . unwords . (concatMap $ replicate 2) . words" <<<"dog cat bird whale"
dog dog cat cat bird bird whale whale

0

আর একটি পদ্ধতি, কেবল ব্যাশ বিল্টিন ব্যবহার করে

$ 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) -এ একটি শেল বিল্টিনও ।
ড্যানিয়েল অ্যান্ডারসন

@DanielAndersson: নিশ্চিত, যে কেন আমি লিখেছি " এছাড়াও শুধুমাত্র ব্যাশ builtins ব্যবহার", আপনার সুন্দর থাকার (ইতিমধ্যে +1 করেছে) মনের মধ্যে উত্তর।
এমপি 18

ঠিক আছে, আপনি আমার মন্তব্যটিকে ভাষা বিভ্রান্তি হিসাবে শ্রেণিবদ্ধ করতে পারেন :-)।
ড্যানিয়েল অ্যান্ডারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.