1

1 つの例の文字列 ABCDEFGHI (例の長さは 10 文字) を含む大きなファイルがあります。実際のファイルの長さは、数百万文字になる可能性があります。

文字列を所定の長さの複数行に分割したいのですが、分割中に文字が一度に1つずつシフトされます。これは、番号を分割した後を意味します。行数 = 文字列の長さ - 分割サイズ + 1

一度に3文字ずつ分割した場合の例で、必要な出力

ABC
BCD
CDE
DEF
...

4文字で分割すると

ABCD
BCDE
CDEF
DEFG

シェルコマンドまたはスクリプトを使用してこの分割を行う最良の方法は何ですか?

ヒントをありがとう

4

5 に答える 5

3

次のようなことを試すことができます:

gawk -v FS="" '{
    r=3 # Set the length
    s=1 # Set the start point
    while(s<=NF-r+1) { 
        for (i=s;i<r+s;i++) { 
            printf $i 
        }
        s++
        print ""
     }
}'

テスト:

$ echo "ABCDEFGHI" | gawk -v FS="" '{r=4; s=1; while(s<=NF-r+1) { for (i=s;i<r+s;i++) printf $i ; s++; print ""}}'
ABCD
BCDE
CDEF
DEFG
EFGH
FGHI
$ echo "ABCDEFGHI" | gawk -v FS="" '{r=3; s=1; while(s<=NF-r+1) { for (i=s;i<r+s;i++) printf $i ; s++; print ""}}'
ABC
BCD
CDE
DEF
EFG
FGH
GHI
于 2013-05-31T14:47:07.950 に答える
0

Python を使用すると、次のように記述できます。

import itertools

filename = "myfile"
length = 4
with open(filename, 'r') as f:
    out = ''
    # get your input character by character
    for c in itertools.chain.from_iterable(f):
        # append it to your output buffer
        out += c
        # if your buffer is more than N characters, remove the first char
        if len(out) > length:
            out = out[1:]
        # if your buffer is exactly N characters, print it out (or do something else)
        if len(out) is length:
            print out
    # if the last iteration was less than N characters, print it out (or do something else)
    if len(out) < length:
        print out

file は、文字列のフル パスを含む文字列です。raw_input()の代わりにも使えますopen()/read()。awk を使用した優れたソリューションは確かにありますが、RTFM でその方法を説明する必要があります。

解決策が何であれ、このアルゴリズムはそれを実行するのに適した方法です。バッファには常に最大 N+1 文字と、新しい読み取り用に 1 文字しか保持しないためです。したがって、このアルゴリズムの複雑さはO(n)、入力文字ストリームに対して線形 ( ) です。

于 2013-05-31T15:01:19.153 に答える