私は100,000行以上のテキストを10進形式に変換できる高速でCPU集約的なソリューションを探しています。
# random ascii
string='QPWOEIRUTYALSKDJFHGZMXNCBV,./;[]75498053$#!@*&^%(*'
convert () {
for ((b=0; b<${#string}; b++ ))
do
# convert to dec, append colon character, add to array
arr+=$(printf '%d,' "'${string:$b:1}");
done;
# show array contents
printf '%s' "${arr[@]::-1}"
}
time convert
上記の方法は短期間の作業に適しており、作業は1秒以内に完了します。
$ ./stackexchange.sh
81,80,87,79,69,73,82,85,84,89,65,76,83,75,68,74,70,72,71,90,77,88,78,67,66,86,44,46,47,59,91,93,55,53,52,57,56,48,53,51,36,35,33,64,42,38,94,37,40,42
real 0m0.059s
user 0m0.032s
sys 0m0.016s
ただし、これは多くの文字を含むファイルには適したソリューションではありません。以下の機能により、CPU が急増し、デフォルトでタスクを完了できません。まあ、数分後にCtrl + cを押して停止しました。以下は、変数が変更されたのと同じスクリプトですstring
。
# random ascii
string="$(cat /tmp/100000-characters.txt)"
convert () {
for ((b=0; b<${#string}; b++ ))
do
arr+=$(printf '%d,' "'${string:$b:1}");
done;
printf '%s' "${arr[@]::-1}"
}
time convert
私もwhileループを試しました。 100,000文字のファイル変換に成功しましたが、まだ完了するのに長い時間がかかりました。
string="$(cat /tmp/100000-characters.txt)"
convert () {
# iteracte through each like
while read -r -n1 char; do
arr+=$(printf '%d,' "'$char");
done <<< "$string"
printf '%s' "${arr[@]::-3}"
}
time convert
大きなテキストファイルをコロンで区切られた10進値に変換するエレガントでシンプルなソリューションはありますか?