awk
명령줄에서 사용자 입력을 읽고 이를 변수로 저장하는 스크립트를 작성하려고 합니다 .
명령줄에서 컴파일하고 실행하면
./myawk.awk -v ID=4 text.sql
ID는 4로 설정된 변수가 됩니다. 그러나 내 스크립트에 제공된 입력 테스트 사례는
./myawk.awk ID=4 text.sql
이 스크립트의 궁극적인 목표는 다음으로 시작하는 ID를 얻는 것입니다.
-- ID
그리고 다음 줄을 인쇄합니다. 내가 지금까지 가지고 있는 것은
#!/bin/awk -f
{
if ($1 ~/--/ && $2 ~/^ID/){
x = NR+1
}
while (NR <= x){
print $0
}
}
-v
해당 줄을 변경하거나 그 앞에 추가하지 않고 변수 ID를 어떻게 읽을 수 있습니까 ? awk
현재 스크립트에 대한 몇 가지 제안 사항도 있을 수 있습니다.
답변1
변수 할당이 스크립트의 명령줄에서 파일 피연산자로 제공되면 awk
파일 피연산자를 사용할 때 해당 지점에 도달하면 할당이 수행됩니다.awk
예:
awk -f script.awk a=1 file1 file2 a=2 file3 a=3 file4
여기서 awk
변수는 읽기 전에 a
설정됩니다 . 이 변수는 파일을 읽을 때까지 이 값을 유지합니다(프로그램에 의해 변경되지 않는 한) . 그런 다음 등 으로 설정하십시오 .1
file1
awk
file2
2
이는 명령줄이 변수를 ID
읽기 전에 변수를 올바르게 설정하고 있음을 의미합니다.4
text.sql
-v ID=4
이것과 이것의 차이점은 ID
어떤 블록에도 설정되지 않는다는 것입니다 BEGIN
. -v ID=4
컬렉션을 사용하여 ID
및 4
그것~ 할 것이다청크로 사용 가능합니다 BEGIN
.
코드의 또 다른 문제는 ID
리터럴 로 사용한다는 것입니다.끈존재하다
if ($1 ~/--/ && $2 ~/^ID/){
즉, 두 번째 필드가 string 으로 시작하는지 테스트합니다 ID
.
while
파일의 행을 반복 하려는 것 같습니다 . 한 줄씩 읽는 루프가 awk
작동 모드에 내장되어 있습니다.희귀한명확해야합니다.
대신에,
$1 == "--" && $2 == ID { getline; print }
이는 문자열 비교(정규식 일치 아님)를 사용하여 현재 줄에서 공백으로 구분된 첫 번째 필드가 string 인지 --
, 두 번째 필드가 변수 값인지 확인합니다 ID
. 그렇다면 다음 입력 줄을 읽고 인쇄합니다.
대신 정규 표현식을 사용하려면
$0 ~ "^-- " ID "$" { getline; print }
이는 이중 대시와 단일 공백으로 시작하는 모든 줄과 일치하고 그 뒤에 값 ID
과 줄 끝( $
줄 끝과 일치)이 옵니다. 일치하는 줄 다음의 줄이 인쇄됩니다.
답변2
awk를 사용하여 사용자 입력을 읽는 방법은 다음과 같습니다.
awk '
BEGIN {
printf "Enter an ID: "
# "-" is the filename for stdin
getline id < "-"
}
# then we can use that value however we like
$1 == "--" && $2 == id {getline; print}
' file
답변3
I Tried with below method and it worked fine
#!/bin/bash
echo "enter the number"
read p
awk -v p="$p" '$1 == "--" && $2 == p {print $0}' filename