数字を含む長いテキスト段落があります。おおよそ次のようになります。
aaaaaaaaaaaaaa100bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc100ddddddddddddddddd
この段落を一連のファイルとしてマークする必要がありますが、各ファイルの数は前の段落より10高くなります。
たとえば、1.txtファイルでは上記のものと似ていますが、2.txtでは次のようにする必要があります。
aaaaaaaaaaaaaa110bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc110ddddddddddddddddd
3.txt では、次のようになります。
aaaaaaaaaaaaaa120bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc120ddddddddddddddddd
テキストは常に同じでなければなりません。新しいファイルが追加されるたびに数字が10ずつ増えるだけです。また、ファイル名(番号)も増やす必要があります。
いつも手でしたが、数量を100個から1000個に増やさなければ大当たりですね! Linuxにそのタスクを実行するコマンドがあるかどうか疑問に思います。
答え1
以下は、各数値に10を加える簡単なPython 3スクリプトです。
#!/usr/bin/env python3
import fileinput
import re
rx = re.compile(r'(\d+)')
for line in fileinput.input():
parts = rx.split(line.rstrip('\n'))
if len(parts) > 1:
for i in range(1, len(parts), 2):
parts[i] = str(int(parts[i]) + 10)
line = "".join(parts)
print(line)
これは、各行が数字ではなく文字で始まると仮定します。もう少し柔軟に変えるのは難しいことではありませんが、しばらくはそうすることができます。
Bashスクリプトから呼び出すにはchmod a+x filename.py
。./splitnum.py
これはPerlコードの1行です:
perl -lne '@s = split(/(\d+)/); for($i=1;$i<=$#s;$i+=2) { $s[$i] += 10 }; print(join("", @s))'
答え2
私はbashソリューションが悪夢になると思います。これは確かに可能です。特にawkを使用したい場合はさらにそうです。しかし、実際にはbashではないので、ここにいくつかのPythonがあります。
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('--template', required=True, help="Template file")
parser.add_argument('--start', default=0, help="Number to begin counting from")
parser.add_argument('--stop', default=100, help="Number to end at")
parser.add_argument('--step', default=10, help="Number to increment by")
args = parser.parse_args()
for i in range(args.start, args.stop, args.step):
with open('{}.txt'.format(i)) as pfile:
pfile.write(args.template.format(count=i))
開始する数字で「--start」を、停止する数字で「--stop」、増分する数字で「--step」を渡すことで実行できます。スクリプトの上部にある変数のテキストを置き換えるか、テキストを別のファイルに入れて「--template」を使用してファイル名を渡してparagraph
段落を変更できます。{count}
テンプレートで必要なときはいつでもこの番号を使用する必要があります。
答え3
数字が常に行の最初の番号であり、ファイルに1行しかない場合は、単純な1行コードを使用してこれを実行できます。
i=100; for k in $(seq 100 10 1000); do sed "s/$i/$k/g" file > file.$k; done
file
これは、元の入力ファイルが次の内容で呼び出されたと仮定します。
$ cat file
aaaaaaaaaaaaaa100bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc100ddddddddddddddddd
そして、を生産しますfile.100
。file.110
。file.1000
。
もちろん、各ファイルに対して別々のコマンドを実行する必要があるため、数秒かかります。より効率的なアプローチのために、perlコマンドを使用できます。
perl -ne 'for ($i=110;$i<=1000;$i+=10){s/(\d+)/$i/eg; open($fh,">","file.$i"); print $fh "$_" }' file