改变特定模式之上的字符

改变特定模式之上的字符

我有一个如下所示的文件:

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

相关内容