列に従ってファイルを複数の小さなファイルに分割する

列に従ってファイルを複数の小さなファイルに分割する

N個の行を持つことができるデータファイルがあります。各行は、スペースで区切られたM個の要素で構成されています。現在、各行を複数のセグメントに分割したいと思います。つまり、セグメント数が3であると仮定すると、元のファイルは3つのファイルに分割され、各ファイルにはN行があり、各行にはM / 3要素があります。 C ++またはJavaプログラムを書くことに加えて、Unix / Linuxでこれを行うための効率的な方法はありますか?

ベストアンサー1

これは同じファイル内のさまざまな数のフィールドを満たし、最後のセグメントは部分的にのみ埋められます。つまり、指定されたより少ない数のフィールドがあります (セグメントごと)。
ただし、行のフィールド数によって指定された数より少ないセグメントが生成される場合、そのセグメントの出力ファイルには何も書き込まれません。

awk -v 'ncol=5' -v 'pfix=file' '{
    fldn = 0
    sfix = 1
    segs = NF/ncol
    # round up if number of field is not evenly divisible by number of columns    
    segs = (segs == int(segs)) ?segs :int(segs)+1   
    while (fldn != NF) {
        fmod = (++fldn) % ncol
        printf "%s%s", dlim, $(fldn) >> pfix sfix 
        if (fmod == 1 ) { dlim = " " }
        if ((fmod==0 ) || (fldn==NF))  { 
            printf "\n" >> pfix sfix 
            dlim = ""; sfix++ 
        }
    } 
}' infile

おすすめ記事