テキストファイルがあり、23文字目のすべての値がありますが、最初から始めて最終値に達するまで各行を増やすには0
その値が必要です。X
1
58
64
私はこのコードを試しましたが、具体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
簡単に:
\K
23文字目は確かに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など、必要なスクリプト言語を使用する方が良いかもしれません。