다음과 같은 파일이 있습니다.
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