후행 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밀리초 안에 실행되고 두 번째 버전은 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$//'.

답변2

새 버전이 sed모든 라인에서 호출되고 있습니다. tr초기 명령에서 제거 CR을 한 번만 호출하면 이를 방지 할 수 있습니다 .

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

관련 정보