我需要創建一個僅包含點符號“。”的文本檔案。在每一行上,重復,直到達到存盤在變數中的特定行數。我現在正在使用 while 回圈,但那些帶有點的檔案需要大約 0.5-5 百萬行。因此,它需要的時間比我想要的要長一些。以下是我當前的代碼:
j=0
while [[ $j != $length ]]
do
echo "." >> $file
((j ))
done
所以我的問題是:除了使用 while 回圈之外,是否有更有效的方法來創建一個包含 x 行且每行包含相同字符(或字串)重復的檔案?
謝謝,
uj5u.com熱心網友回復:
您可以使用yes和head:
yes . | head -n "$length" > "$file"
這應該比重復打開和關閉檔案以一次寫入兩個位元組要快得多。
uj5u.com熱心網友回復:
此代碼中最耗費資源的部分是重定向 ( echo '.' > $file)。為了解決這個問題,您需要“構建”一個字串并$file僅重定向到一次而不是$length次。
j=0
while [[ $j != $length ]]
do
builder=${builder}.
done
echo "$builder" > $file
但是,您仍然處于回圈中,這可能不是資源的最佳利用。為了解決這個問題,讓我們從這個答案中獲取靈感:
printf '.\n%.0s' $(seq $length) > $file
請注意,這里我們使用$(seq $length)而不是{1..$length}因為 bash 不會擴展{1..$length}到0 1 2 3 4 5 6 7 8 9 10如果長度為 10(請參閱此問題)
uj5u.com熱心網友回復:
bash如果僅僅是因為為回圈中的每個命令啟動一個新的作業系統行程(每次通過回圈)的開銷,那么(例如,通過回圈)中的重復動作總是會很慢。在這種情況下,每次通過回圈時打開和關閉輸出檔案都會產生額外的開銷。
您想尋找一種解決方案來限制需要創建/關閉的作業系統行程的數量(在這種情況下,限制您打開/關閉輸出檔案的次數)。根據您要使用的軟體/工具/二進制檔案,會有很多選項。
一個awk想法:
awk -v len="${length}" 'BEGIN {for (i=1;i<=len;i ) print "."}' > newfile
雖然這確實使用了一個“回圈” awk,但我們只在該級別查看單個作業系統行程bash,并且我們只打開/關閉輸出檔案一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455965.html
