簡単に:

簡単に:

テキストファイルがあり、23文字目のすべての値がありますが、最初から始めて最終値に達するまで各行を増やすには0その値が必要です。X15864

私はこのコードを試しましたが、具体sed的ではなく0すべての値を64値に変更します。

for i in $(seq 1 1 64); do
   sed -e "s/0/$i/g" file.txt > newfile.txt
done

私が持っているものは次のとおりです。

ATOM  1     C0   ODA  0          1.452   2.430  23.632  1.00  1.00           C
ATOM  2     C1   ODA  0          1.839   1.672  22.372  1.00  1.00           C
...
ATOM  3711  H56  ODA  0         30.750  32.945   0.998  1.00  1.00           H
ATOM  3712  H57  ODA  0         31.934  32.195   0.165  1.00  1.00           H

そして私が望むもの。

ATOM  1     C0   ODA  1          1.452   2.430  23.632  1.00  1.00           C
ATOM  2     C1   ODA  1          1.839   1.672  22.372  1.00  1.00           C
...
ATOM  3711  H56  ODA  64        30.750  32.945   0.998  1.00  1.00           H
ATOM  3712  H57  ODA  64        31.934  32.195   0.165  1.00  1.00           H

私はsedまだそれを使用することに慣れていません。それは私のbashの知識の限界です。もっと良いかもしれませんがawk、それについてはわかりません。

答え1

もしあなたなら本物フィールド内の特定の文字位置を変更する必要がある場合は、空のフィールドフィールド区切りawk文字を設定できます。

awk 'BEGIN{FS=""; OFS=FS} {$23 = int(FNR / 58) + 1 ; print}' file

OTOH本当に5番目のスペースを分離して修正したい場合大地その後、デフォルトの区切り文字を使用できます。

awk '{$5 = int(FNR / 58) + 1 ; print}' file

答え2

perl -lpe 's/^.{22}\K0/$. % 58 ? $a||0 : $a++/e'  yourfile

簡単に:

\K23文字目は確かに0あなたの仕様と一致するので、最初の22文字をスキップして一致しないようにしてください。行番号は、カウンタ$. % 58を一定に保つ必要があるのか​​、それともインクリメントするのかを示します。

答え3

列 23 (または指定された例では列 5) から 0 のみを置き換えるには、次のようにします。

sed -e "s/^\(\(\S\S*\s\s*\)\{4\}\)0 /\1$i/" file.txt > newfile.txt

しかし、この文は単にあなたのsedの知識を向上させるためのものです。増分変数に置き換えることは、通常のsed操作ではありません。これは可能ですが、実用的ではありません。 sedをシェルスクリプトと混在させることはできますが、PythonやPerlなど、必要なスクリプト言語を使用する方が良いかもしれません。

関連情報