숫자가 포함된 긴 텍스트 단락이 있습니다. 대략 다음과 같습니다.
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