조회 파일에서 일부 변수를 할당하기 위해 쉘 스크립트를 사용하려고 합니다.
일이 좀 있는데 불필요하게 느린 것 같아요.
스크립트:
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)를 추가합니다. 기본적으로 이는 개행 문자입니다.