我有以下代碼
printf '\xFF%.s' {1..10} >SomeFile.bin
這讓我可以將包含 0xFF 的 10 個位元組寫入檔案。
但我想向該檔案寫入不同數量的位元組。但是,花括號序列不適用于變數。
有沒有辦法使用變數而不是硬編碼的 10 次重復來執行相同的操作?
uj5u.com熱心網友回復:
堅持接近 OP 的當前代碼:
x=10
printf '\xFF%.s' $(seq $x) > SomeFile.bin
對于越來越大x的seq方法值需要越來越多的 cpu 和記憶體,因此在某些時候可能值得查看回圈構造,例如awk/for-loop:
awk -v x="9999999" 'BEGIN {for (i=1;i<=x;i ) printf "\xff"}' > SomeFile.bin
對于x=9999999:
printf/seq- 運行 48 秒;記憶體波動最大 950 MBawk/for-loop- 運行 3 秒;可忽略的記憶體使用
注意:我的系統:(cygwin在虛擬機中運行)GNU bash 4.4.12 (printf builtin),,,,GNU seq 8.26GNU awk 5.1.1
uj5u.com熱心網友回復:
我的方法是:
n=42
printf '%*s' $n '' | tr ' ' '\377' > file.bin
也許
dd if=/dev/zero bs=$n count=1 | tr '\0' '\377' > file.bin
對于較大seq的.awkn
uj5u.com熱心網友回復:
( time ( mawk2 -v ___='9999999' -v ____='\377' — '
BEGIN {
OFS = ____
if ( ((_ =_ =_^= ORS = "") _)^_<=(__= __)) {
print $((NF=__)*!_)
} else { _____= ___
___^=_<_
while(_^_<_____^___^-!!_) {
___ =___ }
__=length(___=sprintf("%*s",
int(_____^___^-!!_) !!_, ORS))
gsub(".",____,___)
_*=____="."
while((__^= _)<_____) {
gsub(____,___,___) } }
print (__^=_)==_____ \
? ___ \
: sprintf("%.*s%.*s",
(_=_____<__) ? _<_:_____-__,
___,_?_____:__,___) }' )
| pvE9 ) | gawk -v ____='\377' -be 'BEGIN { FS = ____
RS = "^$"
} END { print NF-!_ }' | lgp3
out9: 9.54MiB 0:00:00 [1.97GiB/s] [1.97GiB/s] [<=> ]
( mawk2 -v ___='9999999' -v ____='\377' -- ; )
0.00s user 0.00s system 35% cpu 0.018 total
9999999
列印in 的
10 million minus 1副本\xFF :: \37718 milli-seconds
基準測驗perl 5.36.0- 競爭明顯變慢:
out9: 9.54MiB 0:00:00 [1.73GiB/s] [1.73GiB/s] [<=> ]
( mawk2 -v ___='9999999' -v ____='\377' -- ; )
0.00s user 0.01s system 35% cpu 0.019 total
68975d7e7cd4f00255f186f69d9beb65 stdin
|
out9: 9.54MiB 0:00:00 [1.78GiB/s] [1.78GiB/s] [<=> ]
( perl -le 'printf("%s", "\377" x 9999999)'; )
0.00s user 0.00s system 18% cpu 0.036 total
68975d7e7cd4f00255f186f69d9beb65 stdin
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520119.html
標籤:重击
下一篇:從npm將引數傳遞給bash腳本
