awk는 다른 일치 항목 이전의 마지막 레코드인 경우에만 일치 항목을 인쇄합니다.

awk는 다른 일치 항목 이전의 마지막 레코드인 경우에만 일치 항목을 인쇄합니다.

파일의 마지막 줄이 상수 텍스트 앞에 있는 경우 특정 패턴과 일치하는 항목을 인쇄하기 위해 awk를 사용하고 싶습니다.

예를 들어, "c" 값이 상수 텍스트 앞의 마지막 줄인 경우에만 인쇄하고 싶습니다.

cat file.txt:
a=1
b=2
c=3
...constant text...

3을 인쇄합니다.

cat file.txt:
a=1
c=3
b=2
...constant text...

아무것도 인쇄하지 마세요.

어떻게 해야 하나요..? awk는 그것이 파일의 마지막 번호인지 어떻게 알 수 있습니까?

답변1

파일의 마지막 줄이 상수 텍스트 앞에 있는 경우 특정 패턴과 일치하는 항목을 인쇄하기 위해 awk를 사용하고 싶습니다.

이 경우 다음을 시도해 보십시오.

awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file

$ cat file1 
a=1
b=2
c=3
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1
3
$ cat file2
a=1
c=3
b=2
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2
$ 

어떻게 작동하나요?

  • -F=

    이는 필드 구분 기호 awk로 사용하라는 의미입니다. =이렇게 하면 a=1또는 같은 필드의 이름과 값을 분리 할 수 있습니다 c=3.

  • /constant text/ && name=="c"{print value}

    constant textand name(이전 줄의 끝에 설정된 대로) 가 있는 줄에 도달하면 c을 인쇄합니다 value.

  • name=$1;value=$2

    현재 행의 경우 첫 번째 필드를 로 저장 name하고 두 번째 필드를 로 저장합니다 value.

답변2

grep을 사용해도 괜찮다면 일치하기 전에 줄을 인쇄하는 옵션이 있습니다.

옵션은 다음과 같습니다: -B num, --before-context=num

귀하의 경우:

cat file.txt|grep -B 1 "constant text"|grep "c="|cut -f2 -d'='

설명하다:

  1. 상수 텍스트 앞의 줄만 인쇄됩니다.
  2. 출력에서 모든 c 값을 필터링합니다.
  3. 두 번째 필드를 추출하려면 "=" 구분 기호를 사용하세요.

답변3

일부 인터넷 검색에서 지금까지 가장 좋은 답변을 찾았지만 이미 답변을 얻었습니다. 다음을 tac사용하여 더 간단하게 만드세요...

tac file | awk 'NR==2{if ( $1=="c") print $2}'

줄 번호는 "상수 텍스트" 다음 줄입니다. "상수 텍스트"가 한 줄인 경우 - NR==2.두 줄인 경우 - NR==3.상수 텍스트가 어떤 형식이어야 하는지 아직 결정되지 않았습니다...

관련 정보