약 300줄 길이의 약 20개 파일이 다음 형식의 데이터로 채워져 있습니다.
62640 usec, 3500 usec
1640 usec, 480 usec
360 usec, 520 usec
1200 usec, 500 usec
340 usec, 520 usec
다음 형식의 Arduino 코드로 변환하고 싶습니다.
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);
이런 식으로, DelayMicroseconds() 함수의 숫자는 각 행의 첫 번째 숫자이고 pulseIR() 함수의 숫자는 각 행의 두 번째 숫자입니다.
어떤 아이디어가 있나요? 나는 이것이 awk에서 가능해야 한다고 생각합니다.
답변1
여기에는 정규 표현식이 필요하지 않습니다. printf
필드를 문자열로 형식화하면 됩니다.
$ awk '{printf("delayMicroseconds(%d);\npulseIR(%d);\n", $1, $3)}' file
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);
답변2
다음을 시도해 볼 수 있습니다.
#!/bin/bash
cat file |sed '1d' | while IFS= read line; do
n1=$(echo $line | awk '{print $1}')
n2=$(echo $line | awk '{print $3}')
echo "
delayMicroseconds($n1);
pulseIR($n2);
"
done
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);
perl
또는 다음을 시도해 볼 수도 있습니다 .
perl -pe 's/(\d+)[\D]+(\d+)[\D]+/delayMicroseconds($1);\npulseIR($2);\n/' file
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);
답변3
GNU sed 사용:
$ sed -Ee 's/([0-9]+) usec, ([0-9]+) usec.*/delayMicroseconds(\1);\npulseIR(\2);/' < data
delayMicroseconds(62640);
pulseIR(3500);
...
-E
현재 줄에서 검색 및 바꾸기 작업을 실행하는 확장 정규식(*)을 사용하도록 지시합니다( 각 sed
입력 줄 에 대해 제공된 지침을 반복).s/pattern/replacement/
sed
패턴은 이전 "원자"의 모든 숫자, 모든 수를 ([0-9]+) usec, ([0-9]+) usec.*
의미하며 일치하는 항목을 저장("캡처")합니다. so는 임의의 숫자를 나타내고 결과를 저장합니다. 문자는 있는 그대로 일치하며 마지막 문자는 임의의 수의 임의 문자와 일치하여 줄 끝에서 가능한 쓰레기를 모두 소모합니다.[0-9]
+
(...)
([0-9]+)
.*
대체에서, \1
및 \2
는 그룹에 포함된 항목으로 대체되며 (...)
(그러나 대괄호 자체는 리터럴임) \n
개행 문자를 나타냅니다(모든 sed
s에 대해 작동하지 않을 수 있음).
(*) 바라보다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?다양한 정규식 유형 간의 차이점을 알아보세요. 또한 많은 sed
온라인 자습서가 있습니다. 하나 또는 두 개를 찾아서 적어도 명령에 익숙해지도록 시도해 보는 것이 좋습니다 s///
.
답변4
GNU awk 사용:
awk -v RS=' usec[,\n] ?' '{print (NR%2?"delayMicroseconds":"pulseIR")"("$0")"}' file
이는 문자열을 usec
레코드 구분 기호로 사용합니다. 이를 통해 각 숫자를 다른 레코드로 캡처할 수 있으므로 print
명령은 원하는 숫자가 있는 2개의 문자열을 번갈아 표시합니다.