awk가 파일 텍스트에서 일치하는 문자열의 여러 줄을 조건부로 인쇄하도록 하려면 어떻게 해야 합니까?

awk가 파일 텍스트에서 일치하는 문자열의 여러 줄을 조건부로 인쇄하도록 하려면 어떻게 해야 합니까?

조건에 맞는 여러 패턴의 라인을 인쇄하는 방법은 무엇입니까?

예를 들어 입력 파일의 경우

섹션에는 다음이 포함됩니다.

ID : 1

Status : Ok

Name : Lulu

Age : 18

State : US




ID : 2

Status : Ok

Name : Master Yi

Age : 22

State : UK



ID : 3

Status : Ok

Name : Garen

Age : 20

State : CA
------------

Codition : IF Age == 20 | print 
----------

ID : 3

Status : Ok

Name : Garen

Age : 20

State : CA

도와주세요

감사해요

답변1

파일이 표시된 것처럼 보이면 각 레코드 사이에 4개의 빈 줄이 있고 각 레코드 사이에 3개의 빈 줄이 있으면 다음을 수행할 수 있습니다.

$ awk -v RS='\n\n\n\n' '/Age : 20\n/' file 
ID : 3

Status : Ok

Name : Garen

Age : 20

State : CA

당신은 이것을 명확히 하지 않았지만 여분의 빈 줄은 실제로 파일의 일부가 아니라 문제의 서식의 인공물일 뿐이라고 생각합니다. 따라서 레코드의 각 줄 사이에는 빈 줄이 하나만 있고 레코드당 레코드 사이에 두 개의 빈 줄이 있습니다. 그렇다면 입력 파일은 다음과 같습니다.

ID : 1
Status : Ok
Name : Lulu
Age : 18
State : US


ID : 2
Status : Ok
Name : Master Yi
Age : 22
State : UK

ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA

파일이 다음과 같으면 다음과 같이 할 수 있습니다.

$ awk -v RS= '/Age : 20\n/' file
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA

답변2

다음 방법은 먼저 필드의 레이블(이름)을 해당 값에 매핑하는 배열을 생성하여 지금 원하는 작업을 수행하고 나중에 복합 조건을 테스트하고, 선택 필드를 인쇄하고, 필드를 다른 순서로 인쇄하도록 쉽게 향상시킬 수 있습니다. 또는 유형 데이터에 대해 다른 작업을 수행합니다 tag:value.

$ cat tst.awk
BEGIN { OFS=" : " }
!NF { next }
{
    tag = val = $0
    sub(/ *:.*/,"",tag)
    sub(/[^:]+ *: */,"",val)
    if ( !(tag in tag2val) ) {
        tags[++numTags] = tag
    }
    tag2val[tag] = val
}
tag == "State" {
    if ( tag2val["Age"] == 20 ) {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            tag = tags[tagNr]
            val = tag2val[tag]
            print tag, val
        }
        print ""
    }
    delete tag2val
    numTags = 0
}

.

$ awk -f tst.awk file
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA

관련 정보