AWK는 특정 형식, 범위 등의 사용자 입력과 일치하는 행을 인쇄합니다.

AWK는 특정 형식, 범위 등의 사용자 입력과 일치하는 행을 인쇄합니다.

다음 내용의 파일이 있습니다 /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으로 변경합니다 .$0NR

관련 정보