조회 테이블에서 값을 할당하는 쉘 스크립트가 너무 느림

조회 테이블에서 값을 할당하는 쉘 스크립트가 너무 느림

조회 파일에서 일부 변수를 할당하기 위해 쉘 스크립트를 사용하려고 합니다.
일이 좀 있는데 불필요하게 느린 것 같아요.

스크립트:

while read line           
    do           
        code=`echo $line | awk -F' ' '{print $1}'`;
        device=`echo $line | awk -F' ' '{print $2}'`;
        state=`echo $line | awk -F' ' '{print $3}'`;
        if  [[ $code == $message ]]
            then
                echo "Translated: $device-$state";
        fi
done <CODE-LIST.txt

코드 목록.txt:

MQTT-CODE   DEVICE  STATE
1-1-32-16236607 RGB_LED ON
1-1-32-16203967 RGB_LED OFF

이 작업을 수행하는 더 빠른 방법이 있나요? (아마도 awk 또는 sed)
도움을 주셔서 감사합니다!

답변1

어때요?

while read code device state junk; do
    if [[ $code == $message ]]; then
        echo "Translated: $device-$state"
    fi
done <CODE-LIST.txt

추가 프로세스(예: 매번 awk 분기)를 사용하면 작업 속도가 크게 느려집니다. read여러 필드를 공백으로 구분하여 읽습니다 $IFS(기본값은 모두 공백임). 나열된 마지막 변수는 줄의 나머지 부분을 수신합니다(있는 경우).

$message나는 그것이 어디서 왔는지 알고 싶습니다 . 어쩌면 코드 조각 외부에 있을까요?

편집: 코드 섹션이 입력에 한 번만 나타나는 경우 break루프를 찾은 후 루프를 종료하면 작업 속도가 빨라집니다.

답변2

모든 작업은 awk를 사용하여 수행할 수 있습니다.
awk는 looping보다 훨씬 빠릅니다 while read.

awk -vM="$Message" '$1==M{print "Translated:",$2"-"$3}' CODE-LIST.txt

설명하다

    -vM="$Message" - Create a variable named M with the value from $Message

     $1==M         - If the first field is equal to variable M($Message)

     {print "Translated:",$2"-"$3} - Write Translated and the second and third fields

     CODE-LIST.txt - The file being read

코드에 대한 추가 의견

A는 ,기본적으로 공백인 OFS(출력 필드 구분 기호)를 인쇄하기 위해 print와 함께 사용됩니다
.
별도로 지정하지 않는 한 기본적으로 코드는 파일의 각 줄에서 실행됩니다.
.
print 명령은 인쇄하는 문자열의 끝에 ORS(Output Record Separator)를 추가합니다. 기본적으로 이는 개행 문자입니다.

관련 정보