특정 패턴 위의 문자 변경

특정 패턴 위의 문자 변경

다음과 같은 파일이 있습니다.

C        0.749421709   0.227878968   1.429202011   0.000039192  
C        1.632642695  -0.091443576   2.542631832  -0.000184939  
N        0.043615933   0.482209037   0.540453037   0.000123677   
H        2.515045687   0.527073165   2.500388888  -0.001989853   
H        1.941072900  -1.159598231   2.494001492   0.001039872   
H        1.143298831   0.111732200   3.499873978   0.001236466     

이는 파일 전체에서 여러 번 반복되는 패턴입니다. 파일 전체에서 "Cn"의 "N" 바로 위에 있는 "C"를 변경하기만 하면 됩니다. sed를 사용해 보았지만 어떤 변형도 작동하지 않는 것 같습니다. 패턴을 찾고 위나 아래에 내용을 추가할 수 있지만 "C"를 "Cn"으로 바꿀 수는 없습니다.

답변1

한 가지 해결책:

tac file |
    awk '{if ($1=="C" && l=="N") $1="Cn"} {l=$1} 1' |
    tac |
    column -t

산출

C   0.749421709  0.227878968   1.429202011  0.000039192
Cn  1.632642695  -0.091443576  2.542631832  -0.000184939
N   0.043615933  0.482209037   0.540453037  0.000123677
H   2.515045687  0.527073165   2.500388888  -0.001989853
H   1.941072900  -1.159598231  2.494001492  0.001039872
H   1.143298831  0.111732200   3.499873978  0.001236466

답변2

원본 파일을 역순으로 나열해 보세요.

tac file | awk '/^N/ {NT = 1} /^C/ && NT {sub (/^C /, "Cn"); NT = 0} 1' | tac

답변3

나는 당신이 다음과 같이 할 수 있다고 생각합니다 sed:

sed -e '$!N;/^C.*\nN/s/^C/Cn/' -e 'P;D' file

이는 패턴 공간에서 2라인 버퍼를 유지하고 C두 번째 라인의 시작 부분에 a가 있는 경우 선행을 대체합니다.N

관련 정보