2012-10-28 3 views
0

awk를 사용하여 파일의 여러 문자열을 대체하려고합니다. 교체하고 삭제해야하는 반복되는 일련의 줄이 있습니다. 예를 들어, 파일awk 여러 줄 바꾸기, N 번째 줄 삭제

INSTANCE "INVX1":"physical" 
"A" : "reset" 
"Y" : "pp_resetbar" 

INSTANCE "INVX1":"physical" 
"A" : "reset" 
"Y" : "pp_resetbar" 

INSTANCE "INVX1":"physical" 
"A" : "reset" 
"Y" : "pp_resetbar" 

을 가지고 있는데 3, 4를 변경/처음 두를 교체하고 삭제할 ..., N 번째를

INSTANCE "INVX1":"physical" 
"A" : "reset" 
"Y" : "pp_resetbar_b" 

INSTANCE "BUFX2":"physical" 
"A" : "pp_resetbar_b" 
"Y" : "pp_resetbar" 

것은 내가 알지도 못하는 솔직히 말해서 어디서 시작하나요. N 번째 발생을 대체하기위한 스크립트를 만들었지 만이를 위해 작동하지 않습니다. 아래를 참조하십시오. 어떤 도움이라도 인정받을 것입니다.

awk -v search=$2 -v replace=$3 -v cnt=$4 '$0 ~ search{c++;if(c==cnt){sub(search,replace);}}1' "$file" > temp && mv temp "$file" 
+0

을 그래서인가? 즉, INSTANCE "INVX2": "physical"이 있지만 나머지는 같으면 인쇄 할 수 있습니까? 또한 반복되는 모든 인스턴스가 함께 그룹화되었거나 나중에 보관해야하는 다른 레코드 뒤에 반복해서 표시 될 수 있습니까? 이 데이터의 출처와 사용 계획에 대한 자세한 정보가 필요하다고 생각합니다. 이것은 당신이 요구 한 수정의 범위를 다루기위한 예로 충분하지 않습니다. – ghoti

+0

'INSTANCE "INVX1": "physical"블록은 일반적으로 그룹핑되지만 모든 파일에 해당하는 것은 아닙니다. 내가 갖고 싶은 스크립트는 내가 게시 한 스크립트와 유사하지만 여러 줄 문자열에 대해 어떤 변경이 발생하는지 알 수있는 스크립트입니다. – geo

+2

나는 아직도 우리가 계속할 충분한 것을 생각하지 않는다. 즉, 패턴의 미래 인스턴스에 대해 상태를 설정하는 awk에서 일련의'if '조건을 사용하여 여러 줄 패턴 감지를 수행 할 수 있지만 매우 국소화 된 솔루션 인 것처럼 보입니다. 데이터를보다 쉽게 ​​분류하고 분석 한 다음,이 데이터를 사용하는 응용 프로그램에 필요한 형식으로 다시 변환하면 어떻게됩니까? – ghoti

답변

1

안된하지만 근접해야합니다 : 그것은 당신이 제거하려는 이들 4 개 라인의 정확한 중복 ...

awk -v RS= -v ORS="\n\n" ' 
    { c = ++count[$0] } 
    c == 1 { <replace some stuff> } 
    c == 2 { <replace other stuff> } 
    c <= 2 
' file