数字を含むテキストを別のファイルに追加する方法(各ファイルの数字が増えます)

数字を含むテキストを別のファイルに追加する方法(各ファイルの数字が増えます)

数字を含む長いテキスト段落があります。おおよそ次のようになります。

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.100file.110file.1000


もちろん、各ファイルに対して別々のコマンドを実行する必要があるため、数秒かかります。より効率的なアプローチのために、perlコマンドを使用できます。

perl -ne 'for ($i=110;$i<=1000;$i+=10){s/(\d+)/$i/eg; open($fh,">","file.$i");  print $fh "$_" }' file

関連情報