다음 내용의 파일이 있습니다 /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,"[ ,]")
구분 기호 공백과 쉼표로 입력을 분할하여 배열에 씁니다a
.for (i in a)
awk가 처리하는 각 행에 대해 배열을 반복합니다.a
split(a[i],b,"-")
의 각 요소는a
구분 기호에서 다시 분할되고-
범위는 배열에 저장됩니다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