我有一个如下所示的文件:
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