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