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