প্রতিটি লাইনে একাধিকবার পুনরাবৃত্তি করুন


17

একটি ফাইলের প্রতিটি লাইন একটি নির্দিষ্ট সংখ্যক বারবার পুনরাবৃত্তি করতে চান।

যেমন প্রতিটি লাইন চারবার পুনরাবৃত্তি করুন:

a
b
c

হয়ে:

a
a
a
a
b
b
b
b
c
c
c
c

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

সি তে এটি করা সহজ হবে তবে আমি ইচ্ছা করি দেশীয় কমান্ডগুলি সম্পর্কে আরও জানতাম তাই আমাকে সর্বদা এই ধরণের ওয়ান-অফ থ্রো-অ্যাভয়েস অবলম্বন না করা উচিত।

উত্তর:


19
  • পার্ল:

    perl -ne 'for$i(0..3){print}' file

    এবং আমাকে এটি পোস্টার হিসাবে একটি মন্তব্য হিসাবে পোস্ট করা হয়েছে @ ডারবার্ট কারণ এটি কেবল দুর্দান্ত:

    perl -ne 'print "$_" x4'
  • awk এবং রূপগুলি:

    awk '{for(i=0;i<4;i++)print}' file
  • bash

    while read line; do for i in {1..4}; do echo "$line"; done; done < file

1
awk's forধনুর্বন্ধনী প্রয়োজন না হলে শুধুমাত্র একটি কমান্ড পুনরাবৃত্তি হয়। perlআপনি foreachলুপ ব্যবহার করেন এবং : সহজ for$i(0..3){print}
ম্যান্যাটওয়ার্ক

4
বিকল্প Perl: perl -ne 'print(($_)x4)'। এছাড়াও, $lineআপনার বাশ সংস্করণে আপনার (প্রতিধ্বনিতে) উদ্ধৃতি দেওয়া উচিত ।
ডারোবার্ট

আমার ক্ষেত্রে আমার উইন্ডোজ লাইন-এন্ডিংস প্রয়োজন। যেমনটি এখানে দেখা যায় তা অর্জন করতে পারেBEGIN { ORS="\r\n" }
দ্য রেড মটরটি

34

আমি ভাবছি যে এটি কোনও গল্ফ ম্যাচে পরিণত হচ্ছে:

sed 'p;p;p' 
awk '1;1;1;1' 
perl -lpE 'say;say;say'   # if Paul McCartney and Michael Jackson were hackers...

ব্যাখ্যা:

সিডের pকমান্ডটি হ'ল বর্তমান লাইনটি প্রিন্ট করা। ডিফল্ট আচরণটি হ'ল পরের লাইনে যাওয়ার আগে বর্তমান লাইনটি মুদ্রণ করা (এজন্য সেড -nআপনাকে এটিকে বন্ধ করতে দেয়)। কিছু পুরানো সেডের সেমিকোলন নেই (আমার মনে হয়) সুতরাং এটি আপনার পক্ষে করা সম্ভবsed -e p -e p -e p

আওক condition {action}জোড়া নিয়ে কাজ করে । যদি ক্রিয়াটি বাদ দেওয়া হয় তবে শর্তটি সত্য হয়ে থাকলে ডিফল্টরূপে বর্তমান লাইনটি প্রিন্ট করা হয়। আওক, অনেক সি-এর মতো ভাষার 1মতোই সত্য হিসাবে বিবেচনা করে । (সম্পূর্ণতার জন্য, যদি শর্তটি বাদ দেওয়া হয় তবে প্রতিটি রেকর্ডের জন্য ক্রিয়াটি কার্যকর করা হবে))

অনেক পার্ল ফাংশন "ডিফল্ট" ভেরিয়েবলের সুবিধা নেয়। এই ওয়ান-লাইনারের সমতুল্য (পার্ল 5.16 তে):

$ perl -MO=Deparse -lpE 'say;say;say'
BEGIN { $/ = "\n"; $\ = "\n"; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    say $_;
    say $_;
    say $_;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

1
+1, যদি এটি হয় তবে আপনি জয়ী হচ্ছেন :) 1অবাক হয়ে ঠিক কী করে ? শর্টহ্যান্ডের জন্য print $0?
টেরডন

3
জঞ্জাল বিবৃতি একটি শর্ত এবং একটি ব্লক দ্বারা গঠিত হয় হয় হয় alচ্ছিক, তবে একটি উপস্থিত থাকতে হবে। ডিফল্ট শর্তটি 1(সত্য); ডিফল্ট ব্লক সমতুল্য {print}। সুতরাং বিবৃতিটির 1অর্থ বর্তমান লাইনের বাফার ( {print}) মুদ্রণ করা হবে । ( {print}এবং {print $0}বেশিরভাগই একই, কি।)
আর্জেজ করুন

আমি এমন কোনও কথা কখনও শুনিনি sedযা কমান্ড টার্মিনেটর হিসাবে সেমিকোলনগুলিকে সমর্থন করে না; সত্যিই কি এমন জিনিস আছে?
ওয়াইল্ডকার্ড


4

আপনি প্রয়োজন ছাড়া এটা করতে পারেন sed, perlঅথবা awk

$ for i in `cat <file>` ; do seq <#> <#> | xargs -i -- echo $i ; done

বা কিছুক্ষণ লুপ ব্যবহার করে:

$ while read i ; do seq <#> <#> | xargs -i -- echo $i ; done < <file>

উদাহরণ

লুপ জন্য
$ for i in `cat sample.txt` ; do seq 1 3 | xargs -i -- echo $i ; done
a
a
a
b
b
b
c
c
c
লুপ করার সময়
$ while read i; do seq 1 2| xargs -i -- echo $i;done < sample.txt
a
a
b
b
c
c

আমি মনে করি যে লুপ সংস্করণটি হোয়াইটস্পেস সম্বলিত যে কোনও লাইনে বিভক্ত হবে, সুতরাং লুপটিকে অগ্রাধিকার দেওয়া উচিত। অন্যথায়, +1 যেহেতু আমি শেল সলিউশনগুলির জন্য চুষছি।
অরিসুপ

@ আইভিলসপ - হ্যাঁ অন্য কেউ এটির পাশাপাশি আমি অন্য প্রশ্নোত্তর পোস্ট করেছে এমন কিছু কোডে এটি উল্লেখ করেছে। আমি মনে করি এটি শেষ হওয়ার প্রাথমিক সুবিধা, যখন লুপটি $ আইএফএস বিভাজকের পক্ষে সহনশীল এবং শেষ প্রান্তে বিভক্ত হবে যেখানে আইএফএসে বিভক্ত হবে।
slm

1

খাঁটি শেল ব্যবহার:

repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile

কেউ কীভাবে হ্যাঁ --helpএকটি বিকল্পের পরিবর্তে স্ট্রিং হিসাবে বিবেচনা করবেন তা জানেন ? [কেস বিবেচনা যেখানে lineহয় --helpবা অন্য কোনো বিকল্প]
user176581

হ্যাঁ,yes -- --help
don_crissti

ব্যবহার yesএবং এর headঅর্থ এটি "খাঁটি শেল" নয়
গ্লেন জ্যাকম্যান

1

এটি আপনার (জিএনইউ সেড) কাজ করতে পারে:

sed 'h;:a;s/[^\n]\+/&/4;t;G;ba' file

প্রতিটি লাইন 4 বার পুনরাবৃত্তি করবে।

বা আপনি যদি পছন্দ করেন:

sed 'h;:a;s/\n/&/3;t;G;ba' file

যেখানে আপনি প্রতিটি লাইন আরও 3 বার পুনরাবৃত্তি।


1

@potong এর উত্তর প্রতিস্থাপন খালি লাইনের কাজ করে না, \+সঙ্গে *এটা ঠিক করা উচিত:

sed 'h;:a;s/[^\n]*/&/4;t;G;ba' file
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.