조건에 맞는 여러 패턴의 라인을 인쇄하는 방법은 무엇입니까?
예를 들어 입력 파일의 경우
섹션에는 다음이 포함됩니다.
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