Bash:100,000文字以上の文字を10進形式に変換しますか?

Bash:100,000文字以上の文字を10進形式に変換しますか?

私は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進値に変換するエレガントでシンプルなソリューションはありますか?

ベストアンサー1

Perlが救出に来る!

perl -nE 'say join ",", map ord, split //' < file
  • -n入力内容を1行ずつ読み、各行のコードを実行します。
  • 分ける空の正規表現で//入力を単一文字に分割
  • 地図各文字をその文字にマッピング注文する
  • 参加する文字から文字列を作成し、その間にカンマを挿入します。
  • 説明する出力結果

入力を1行ずつ処理したくない場合は、追加の調整が必要な場合があります。

おすすめ記事