লিনাক্স কমান্ড একটি ফাইল নিজের সাথে n বার


31

আমি প্রজেক্ট গুটেনবার্গের (প্রায় 0.5MB) কাছ থেকে একটি সরল পাঠ্য ফাইলের বইটি নিয়েছি যা nএকটি বড় টেক্সট ফাইল তৈরি করতে আমি নিজেই বারবার মনস্থ করতে চাই যা আমি কিছু অ্যালগরিদমকে বেঞ্চমার্ক করতে পারি। এটি অর্জনের জন্য আমি কি একটি লিনাক্স কমান্ড ব্যবহার করতে পারি? catআদর্শ শোনাচ্ছে, তবে মনে হয় না যে কোনও ফাইল নিজের উপর চাপিয়ে দেওয়া খুব ভাল খেলবে, সাথে সাথে nপ্রশ্নের সরাসরি অংশের সরাসরি সমাধান করে না ।


2
কিছু ধরণের লুপ ব্যবহার, এবং সংযোজন? সুতরাং foo.txt পুনরাবৃত্তি করুন >> বার.টিএসটিএস্ট এবং এমন কিছুতে মুড়িয়ে দিন যা কমান্ডটি বহুবার চালাবে?
যাত্রামন গীক

উত্তর:


35

এর দুটি অংশ, আমার কাছে - প্রথমে - পাঠ্য ফাইলটিকে স্ট্যান্ডার্ড আউটপুটে আউটপুট দেওয়ার জন্য বিড়াল ব্যবহার করা এবং এটি অন্য ফাইলে যুক্ত করতে অ্যাপ্লিকেশন ব্যবহার করুন - উদাহরণস্বরূপ foo.txt >> bar.txt foo.txt এ bar.txt যুক্ত করবে

তারপরে এটি এন বার চালান

for i in {1..n};do cat foo.txt >> bar.txt; done

আপনার কমান্ডের সাথে এই কমান্ডে এন প্রতিস্থাপন

যেখানে আপনার নম্বরটি সেখানে কাজ করা উচিত

আপনি যদি csh ব্যবহার করেন তবে 'পুনরাবৃত্তি' কমান্ড রয়েছে।

উত্তর সম্পর্কিত পুনরাবৃত্তিগুলি এখান থেকে অনুলিপি করা হয়েছে এবং আমি এটি ডিফল্ট ব্যাশ শেলের একটি উবুন্টু 11.04 সিস্টেমে পরীক্ষা করেছি tested


3
মজাদার ঘটনা: এটি আসলে 'এন' প্রতিস্থাপন না করেই কাজ করে, এক্ষেত্রে এটি ASCII '1' এবং ASCII 'n' (তাই 62 বার) এর মধ্যে প্রতিটি চরিত্রের জন্য একবার শরীর সম্পাদন করবে। তবে {1..12}সঠিকভাবে 12 বার শরীর চালাবে।
আর্নআট এঙ্গেলেন

1
আপনি প্রতিটি পুনরাবৃত্তিতে সংযোজন না করে কেবল পুরো পাইপলাইনটি পুনঃনির্দেশ করতে চাইতে পারেন:for i in {1..n};do cat foo.txt; done > bar.txt
টবি স্পিড

2

আমি বিরক্ত তাই এখানে একটি ফাইল নিজেকে কীভাবে সংযুক্ত করতে হয় তার বেশ কয়েকটি পদ্ধতি রয়েছে, বেশিরভাগ ক্ষেত্রে headক্রাচ হিসাবে। ক্ষমা করুন যদি আমি নিজেকে খুব বেশি বোঝাতে পারি তবে আমি ঠিক বলতে চাই: পি


ধরে নেওয়া Nহল আপনি করতে চান এমন আত্মসংক্ষেপের সংখ্যা এবং আপনার ফাইলটির নাম দেওয়া হয়েছে file

ভেরিয়েবল:

linecount=$(<file wc -l)

total_repeats=$(echo "2^$N - 1" | bc) # obtained through the power of MATH

total_lines=$((linecount*(total_repeats+1)))

tmp=$(mktemp --suffix .concat.self)

একটি কপি দেওয়া fileনামক file2, total_repeatsযতবার হয় fileযোগ করা করতে হবে file2এটি একই যেন করতে fileনিজেই ঘনিভূত হয় Nবার।

বলেছে ম্যাথ এখানে কমবেশি রয়েছে: ম্যাথ (সংক্ষেপে)

এটি প্রথম সেমিস্টার কম্পিউটার বিজ্ঞানের জিনিসপত্র, তবে আমি একটি আবেশন প্রমাণ করেছি তাই কিছুক্ষণ হয়ে গেছে যাতে আমি এটির উপরে 2^Loopsউঠতে পারি না ... (এছাড়াও এই ক্লাসটির পুনরাবৃত্তিটি বেশ সুপরিচিত তাই খুব আছে ...)


POSIX

আমি কয়েকটি নন-পিক্সিক্স জিনিস ব্যবহার করি তবে সেগুলি প্রয়োজনীয় নয়। আমার উদ্দেশ্যে:

 yes() { while true; do echo "$1"; done; }

ওহ, আমি কেবল এটিই ব্যবহার করেছি। ওহ ভাল, বিভাগটি ইতিমধ্যে এখানে ...


পদ্ধতি


head লাইনকাউন্ট ট্র্যাকিং সহ

ln=$linecount
for i in $(seq 1 $N); do
    <file head -n $ln >> file;
    ln=$((ln*2))
done

কোনও টেম্প ফাইল, কোনও বিড়াল, এমনকি খুব বেশি গণিত এখনও নেই, সমস্ত আনন্দ।


teeসঙ্গে গণিত

<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file

এখানে teeথেকে পড়তে হচ্ছে fileতবে চিরতরে এতে সংযোজন করা হয়, সুতরাং এটি ফাইলটি পুনরায় headপুনরুদ্ধার করা অবিরত থাকবে until এবং ম্যাথের কারণে কখন এটি বন্ধ করা যায় তা আমরা জানি । সংযোজনটি ওভারবোর্ডের মধ্য দিয়ে যায়, তাই আমি একটি অস্থায়ী ফাইল ব্যবহার করেছি। আপনি অতিরিক্ত লাইনগুলি ছাঁটাইও fileকরতে পারেন।


evalঅন্ধকারের প্রভু!

eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file

এটি কেবল cat file file file ...এটিকে প্রসারিত করে এবং এটি দেখায়। আপনি $tmpফাইলটি ছাড়াই এটি করতে পারেন :

eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
  head -n $((total_lines-linecount)) >> file

দ্বিতীয় এবং head"রচনাগুলি" এর catমধ্যবর্তী একজনকে এবং লেখার অপারেশনের মধ্যে রেখে। আপনি catঅন্যের catসাথেও কৌতুক করতে পারেন তবে এতে বেমানান আচরণ রয়েছে। এটা চেষ্টা কর:

test_double_cat() {
    local Expected=0
    local Got=0
    local R=0
    local file="$(mktemp --suffix .double.cat)"
    for i in $(seq 1 100); do

        printf "" > $file
        echo "1" >> $file
        echo "2" >> $file
        echo "3" >> $file

        Expected=$((3*$(<file wc -l)))

        cat $file $file | cat >> $file

        Got=$(<file wc -l)

        [ "$Expected" = "$Got" ] && R="$((R+1))"
    done
    echo "Got it right $R/100"
    rm $file
}

sed:

<file tr '\n' '\0' |
    sed -e "s/.*/$(yes '\0' | head -n $total_repeats | tr -d '\n')/g" |
        tr '\0' '\n' >> file

ফোর্সেস sedএকটি লাইন হিসেবে সম্পূর্ণ ফাইল পড়া অনুবাদ করে, এবং এটা সব যেমনটি রয়েছে, তারপর, এটা পেস্ট $total_repeatsযতবার।

আপনার ফাইলটিতে কোনও নাল অক্ষর থাকলে অবশ্যই এটি ব্যর্থ হবে। আপনি জানেন যে একটি আছে চয়ন করুন।

find_missing_char() {
  local file="${1:-/dev/stdin}"

  firstbyte="$(<$file fold -w1 | od -An -tuC | sort -un | head -n 1)"
  if [ ! "$firstbyte" = "0" ]; then
    echo "\0"
  else
    printf "\\$(printf '%03o\t' $((firstbyte-1)) )"
  fi
}

এখনকার ছেলেমেয়েদের জন্য এগুলিই, আমি আশা করি এই স্বেচ্ছাচারী উত্তরটি কাউকেই বিরক্ত করবে না। আমি এগুলির সবগুলি অনেকবার পরীক্ষা করে দেখেছি তবে আমি কেবল দু'বছরের শেল ব্যবহারকারী তাই আমার অনুমানটি মনে রাখবেন। এখন ঘুমোতে ...

rm $tmp


2

আপনি অবশ্যই এর catজন্য ব্যবহার করতে পারেন :

$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo

$nঅনুলিপি পেতে , আপনি এখানে yesপাইপযুক্ত ব্যবহার করতে পারেন head -n $n:

$ yes /tmp/f | head -n 10
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f

একসাথে যে দেয়

yes /tmp/f | head -n $n | xargs cat >/tmp/output
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.