小さなチャンクに分割する必要がある長い文字列がありますが、チャンクはオーバーラップする必要があります。出力文字列とオーバーラップの長さは可変でなければなりません。
例:
テキストファイルでこれから始めます:
-----------------------------------------------------
出力は次のように記述されています。
---------------------
---------------------
---------------------
次のような意味だと思います:
def get_overlapped_chunks(textin, chunksize, overlapsize):
return [ textin[a:a+chunksize] for a in range(0,len(textin), chunksize-overlapsize)]
説明
[0, step, 2*step,..., len(input)-chunksize]
ここでは、リスト内包表記を使用します。これは、出力文字列がwhereで始まるインデックスを取得し、step = chunksize-overlapsize
これらの位置に長さチャンクサイズのテキストを返します。
使用法
この関数は、次のように使用できます。
textin = ''.join(open(FILENAME, 'r').readlines()) # text as single line
CHUNKSIZE=10
OVERLAPSIZE = 2
chunks = get_overlapped_chunks(textin, CHUNKSIZE, OVERLAPSIZE)
fout = open(FILEOUT, 'w')
fout.writelines(chunks)
stringを指定すると、 slicess
を使用してサブシーケンスを取得できます。
>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> s[0:5]
'abcde'
ここで、スライスは 0 番目の文字から 5 番目の文字まで (ただし含まない) を提供します。このrange(start, end, step)
関数は、 から始まり、 で増加する数のリストを返しstart
ますend
。step
>>> range(0, len(s), 6)
[0, 6, 12, 18, 24]
2つを組み合わせると、次のようなものが得られます
>>> for i in range(0, len(s), 6):
... print s[i:i+8]
...
abcdefgh
ghijklmn
mnopqrst
stuvwxyz
yz
スライス操作は「寛容」であるため、最後の行に からの 8 文字未満の短い回答が得られs[24:34]
ます。
ピュアバッシュ:
length=20
overlap=3
while read line ; do
idx=0
while [ $idx -lt ${#line} ] ; do
echo "${line:idx:length}"
((idx+=length-overlap))
done
done < "$infile"