मैं बोर हो गया हूँ इसलिए यहाँ कुछ और तरीके हैं कि कैसे किसी फाइल को अपने आप 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
समय के लिए समाप्त किया गया था ।
कहा MATH यहाँ है, कम या ज्यादा: MATH (gist)
यह पहला सेमेस्टर कंप्यूटर विज्ञान सामान है, लेकिन यह एक समय हो गया है क्योंकि मैंने एक इंडक्शन प्रूफ किया है, इसलिए मैं इसे खत्म नहीं कर सकता ... (यह भी पुनरावृत्ति की यह कक्षा बहुत अच्छी तरह से ज्ञात है 2^Loops
इसलिए ऐसा भी है ...)
POSIX
मैं कुछ गैर-पॉज़िक्स चीजों का उपयोग करता हूं लेकिन वे आवश्यक नहीं हैं। मेरे उद्देश्यों के लिए:
yes() { while true; do echo "$1"; done; }
ओह, मैंने केवल उसका उपयोग किया है। ओह ठीक है, अनुभाग यहाँ पहले से ही है ...
तरीके
head
linecount ट्रैकिंग के साथ।
ln=$linecount
for i in $(seq 1 $N); do
<file head -n $ln >> file;
ln=$((ln*2))
done
कोई अस्थायी फ़ाइल, कोई बिल्ली नहीं, बहुत अधिक गणित अभी तक नहीं, सभी खुशी।
tee
MATH के साथ
<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file
यहाँ tee
से पढ़ रहा है, file
लेकिन इसे हमेशा के लिए संलग्न है, इसलिए यह फ़ाइल को तब तक दोहराता रहेगा जब तक कि head
यह बंद न हो जाए। और हम जानते हैं कि MATH के कारण इसे कब रोकना है । एप्लेटिंग के माध्यम से चला जाता है, इसलिए मैंने एक अस्थायी फ़ाइल का उपयोग किया। आप अतिरिक्त लाइनों को 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