我有一個bash腳本,它做了大量的字串操作。正如我所知,從檔案中讀取是很慢的。因此,我在腳本開始時讀取整個檔案,而不是每次需要它的內容時都這樣做
。readarray -t lines < "$filename"/span>
但是每當我需要將這些行送入一個接受輸入的程式(例如,awk, cut, grep)時,我無論如何都要列印它們并創建一個管道。下面是一個例子,它可以找到一個檔案中包含冒號的第一行
line=$(printf -- '%s
' "${lines[@]}"| grep -n -m 1 :)
所以我開始想,我不就是通過對echo的額外呼叫和創建一個管道來使它變得更慢嗎?處理這種情況的最佳方法是什么?
uj5u.com熱心網友回復:
如果你想要的是看哪個更快,你可以嘗試使用time:
time readarray -t lines < "$filename"/span>
time line=$(printf -- '%s
' "${lines[@]}"| grep -n -m 1 :)
這將給你帶來以毫秒為單位的時間,并將讓你看到哪一個更快呢?
uj5u.com熱心網友回復:
你可以使用bash特有的<<<運算子來將變數納入命令,而不需要echo/printf-它們:
λ printf "test
行
" > 檔案
λ cat file
測驗
行
λ readarray -t lines < file
λ wc -c <<< "${lines[0]}"。
5
λ printf "%s" "${lines[0]}"
test
另外,假設你不需要一次讀完所有的內容,你可以用這樣的方法直接消耗檔案,而不是把檔案讀到一個變數中:
while read -r line; do
grep -n -m1 ':' <<< "$line" & & {
echo "got colon"
break
}
done < filename
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324768.html
標籤:
