숫자가 포함된 텍스트를 다른 파일에 추가하는 방법(각 파일에서 숫자가 증가함)

숫자가 포함된 텍스트를 다른 파일에 추가하는 방법(각 파일에서 숫자가 증가함)

숫자가 포함된 긴 텍스트 단락이 있습니다. 대략 다음과 같습니다.

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 코드의 한 줄입니다:

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

숫자가 항상 줄의 첫 번째 번호이고 파일에 한 줄만 있는 경우 간단한 한 줄 코드를 사용하여 이 작업을 수행할 수 있습니다.

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

관련 정보