末尾のCRをすばやく削除するには?

末尾のCRをすばやく削除するには?

以下は、データベースをJSONにダンプし、Debian wheezyとうまく機能するソースファイルです。

#!/bin/sh

echo "Status: 200"
echo

echo {

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2

do
if [ "$col2" = "true" -o "$col2" = "false" ]
then
  echo "\"$col1\" : $col2,"
else
  case $col2 in
    *['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
  esac
  echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }

Debian Stretch用に更新する必要がありますが、不要なキャリッジリターンが発生します。問題ありません。問題を解決し、このバージョンでは正しい出力を得ました。

#!/bin/sh

echo "Status: 200"
echo

echo {

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | while IFS=, read col1 col2

do
col2=`echo "$col2" | sed 's/.$//'`
if [ "$col2" = "true" -o "$col2" = "false" ]
then
  echo "\"$col1\" : $col2,"
else
  case $col2 in
    *['"']* ) col2=$(echo $col2 | sed 's/\"//g') ;;
  esac
  echo "\"$col1\" : \"$col2\","
fi
done
echo "\"ZZZZZ\" : \"\""
echo }

問題は正しいバージョンが非常に遅いことです(データベースは大きくありませんが、私のハードウェアは限られています)。最初のバージョンは約300ミリ秒で実行され、2番目のバージョンは6秒で実行されます。実行速度を上げるには何を変更する必要がありますか?

ありがとうございます!

ベストアンサー1

実行によりパフォーマンスの問題が発生する可能性があります。

col2=`echo "$col2" | sed 's/.$//'`

各行に。注:キャリッジリターンではない場合でも、各行の最後の文字を削除してください。使用することをお勧めしますsed 's/\r$//'

出力全体に対してこれを行うことができます。

printf ".mode csv\nselect * from cfg;" | sqlite3 /home/ftproot/cfg/config.db | sed 's/\r$//' | while IFS=, read col1 col2

すべての文字を削除し'\r'、行の途中に表示される文字を保持したくない場合でも、tr -d '\r'置換を使用できますsed 's/\r$//'

おすすめ記事