次のファイルがあります。
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
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
2行目の先頭にaがある場合は先行を置き換えます。N