
다음 내용이 포함된 파일이 있습니다 /tmp/a.txt
.
1
2
3
4
5
를 사용하여 AWK
사용자에게 다음 형식 중 하나로 범위를 지정하고 일치하는 줄을 인쇄하라는 메시지를 표시하고 싶습니다.
쉼표로 구분됨
1,2,3
공간 분리
1 2 3
그리고 범위 내에서 -
1-3
예상 출력:
1
2
3
다음은 사용자의 입력을 캡처하는 샘플 awk 명령입니다. 필요한 출력을 얻으려면 여기에 무엇을 입력해야 합니까?
awk 'BEGIN { printf "Enter the range: " ; getline name < "-" }{?}' /tmp/a.txt
답변1
다음 명령을 사용할 수 있습니다 awk
.
awk 'BEGIN { printf "Enter the range: " ; getline r < "-"; split(r,a,"[ ,]")} \
{for (i in a){split(a[i],b,"-"); if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR)){print}}}' file
설명:
printf "Enter the range: " ; getline r < "-";
질문에서 복사됨(사용자 입력을 변수로 읽기 위해r
)split(r,a,"[ ,]")
구분 기호 공백과 쉼표로 입력을 분할하여 array 에 씁니다a
.for (i in a)
각 라인 awk 프로세스에 대해 배열을 통해 반복됩니다.a
split(a[i],b,"-")
의 각 요소는a
구분 기호에서 다시 분할되고-
범위는 array 에 저장됩니다b
.if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR))
현재 처리 중인 줄 번호가awk
배열에 있거나a
줄 번호가 배열의 두 숫자 사이에 있는 경우b
...{print}
... 줄을 인쇄하십시오.
다음과 같은 결합 입력을 사용할 수도 있습니다.
1-3,4 5 7-13
답변2
NR
라인 번호( )를 입력된 범위와 일치시키려는 것인지, 전체 라인의( $0
) 또는 첫 번째 필드의( $1
) 값과 일치 시키려는 것인지 명확하지 않습니다 .
awk '
BEGIN {printf "Enter the range: "
getline ANS < "/dev/tty"
for (n=split (ANS, T, "[ ,]"); n; n--) {for (m=split (T[n], R, "-"); m; m--) TGT[R[m]]
for (i=R[1]+1; i<R[2]; i++) TGT[i]
}
}
$1 in TGT
' file
Enter the range: 1-3
1
2
3
또는 $1
으로 변경합니다 .$0
NR