bash 스크립트에서 awk로 여러 줄 레코드를 처리하려면 어떻게해야합니까?


13

example.txt는 다음과 같습니다

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

bash 스크립트를 사용하고 위의 파일에서 이름으로 식당을 검색하려고한다고 가정 해 보겠습니다. 사용자에게 식당 이름을 입력하고 해당 식당에 관한 정보를 인쇄해야합니다 (5 줄).

awk '/McDonalds/> /KFC/' example.txt

위의 코드 줄은 "McDonalds"및 "KFC"패턴과 일치하는 전체 줄을 인쇄하지만 텍스트 파일에서 첫 번째 줄만 인쇄하지만 해당 레스토랑에 대한 나머지 정보는 인쇄하지 않습니다. 식당 이름의 사용자 입력만으로 모든 정보 (5 줄)를 인쇄하도록하려면 어떻게해야합니까?

답변:


11

awk를 사용하면 레코드 구분 기호를 변경할 수 있습니다 . 기본적으로 줄 바꿈이므로 파일의 각 줄은 레코드입니다. RS변수를 빈 문자열로 설정하면 awk는 레코드가 빈 줄로 분리되는 것으로 간주합니다.

awk -v name="KFC" -v RS="" '$0 ~ "Restaurant: " name' example.txt

귀하의 질문을 이해하지 못합니다. 꽤 모호합니다. 할당 또는 사용하지 않는 사용법입니까?
glenn jackman

3

사용 sed:

$ sed -n '/KFC/,/^$/p' file
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

$ sed -n '/McDo/,/^$/p' file
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

설명

이것은 기본 sed기능입니다. SED에 유용한 단선 스크립트를 참조 할 수 있습니다.

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive

설명을 추가하십시오.
BMW

그러나 제안 된 수정 사항이 거부 된 이유는 무엇입니까? 나는 대답을 바꾸지 않았다. 방금 형식을 개선했습니다.
데이지

2
$ awk '$2=="KFC" {print; for(i=1; i<=4; i++) { getline; print}}' example.txt

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

위의 명령은 for 루프에 공급되었으므로 현재 줄과 함께 연속적인 4 줄을 가져 와서 인쇄합니다. 검색 패턴 $2=="KFC"은 여러 줄에서 특정 줄을 가져 오는 데 도움이됩니다.


0

또 다른 가능한 해결책 :

awk 'BEGIN{FS="\n";RS="\n\n"}{if($1=="KFC")print $0}' example.txt

{if($1=="KFC")print $0}단지에 응축 될 수있다 $1 == "KFC"진정한 조건에 대한 기본 작업 기록을 인쇄하는 것입니다 때문에.
muru

0

원하는 이름을 포함하는 행에서 단어를 포함하는 마지막 행으로 인쇄하면 충분합니다 Phone(물론 모든 항목이 동일한 패턴을 따르고 항상 Phone종료 레코드를 갖는다 고 가정 할 때 )

$> awk '/5 guys/,/Phone/' restaurants.txt                                     
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
$> awk '/McDonalds/,/Phone/' restaurants.txt                                  
Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

약간 복잡하게 만들고 싶다면 일치 후 정확히 5 줄을 인쇄 할 수 있습니다.

awk '/McDonalds/{stop=NR+5}; NR<=stop ' restaurants.txt                    

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

stop변수 때문에, 설정되지 않습니다 NR<=stop때까지 아무것도 인쇄되지 않습니다 /McDonalds/{stop=NR+5;}부분은 실제로 변수를 설정하고, 우리가 경기를 찾을 때에만 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.