단락의 한 줄 위와 아래에 있는 단어를 일치시켜야 합니다.

단락의 한 줄 위와 아래에 있는 단어를 일치시켜야 합니다.

3줄로 구성된 단락이 있는데 줄 위와 아래의 단어를 이름과 일치시켜야 합니다.

현재 파일

time toto
time toto name titi
time toto 

time tutu
time tutu name tata
time tutu 

나는 이것을 원한다.

time titi
time titi name titi
time titi 

time tata
time tata name tata
time tata 

나는 성공하지 않고 이것을 시도했습니다.

awk 'NR>1{if(/name/) sub($2,$4,prev); print prev} {prev=$0}' fic.txt

해결책이 있나요?

답변1

입력이 실제로 표시된 것과 같고 영향을 받는 모든 문자열에 정규식 메타 문자나 역참조가 포함되지 않고 하위 문자열이나 입력 위치에 원하지 않는 다른 항목으로 나타나지 않는 경우 다음을 수행합니다.

$ awk -v RS= -v ORS='\n\n' '{gsub($2,$6)}1' file
time titi
time titi name titi
time titi

time tata
time tata name tata
time tata

이것이 필요한 전부가 아니라면 질문을 편집하여 이것이 작동하지 않는 경우를 포함하는 보다 대표적인 입력/출력 예제를 제공하십시오.

답변2

스크립트가 일치하는 줄을 찾으면 이전 줄만 수정합니다 /name/. 현재 줄과 다음 줄도 수정해야 합니다.

이 스크립트는 요청된 수정을 수행합니다.

awk '$3=="name" { search=$2; repl=$4; } # define new replacement
NR>1 {
  sub(search,repl,prev); print prev; # modify and print previous line
}
{
    prev=$0; # save line for next processing cycle
}
END {
  sub(search,repl,prev); print prev; # process last line
}' fic.txt

물론 댓글을 삭제할 수도 있습니다.

이를 사용하여 인쇄된 입력 파일의 예:

time titi
time titi name titi
time titi

time tata
time tata name tata
time tata

또 다른 버전은 필드 수가 예제 입력에 표시된 것과 정확히 일치하고 각 그룹 내의 첫 번째 및 세 번째 행이 두 번째 행에서 파생될 수 있다는 전제 조건에 의존합니다.

awk 'NF>2 {
  print $1,$4;
  print $1, $4, $3, $4;
  print $1, $4;
  print "";
}' fic.txt

답변3

다른 방법:

awk '{
    if ( NF==2 ) {   
        pr=$0
    }
    if ( NF>2 ) {   
        split(pr,a) ; print a[1]FS$4
        sub($2,$4) ; print
        split(pr,a) ; print a[1]FS$4
    }
    if ( NF==0 )  { print  } 
    }' fic.txt

관련 정보