আমি বিরক্ত তাই এখানে একটি ফাইল নিজেকে কীভাবে সংযুক্ত করতে হয় তার বেশ কয়েকটি পদ্ধতি রয়েছে, বেশিরভাগ ক্ষেত্রে 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