0

次の形式のテキスト ファイルがあります。

10900   PART1   3211034
10900   PART2   3400458
10900   PART4   3183857
10900   PART3   4152115
10900   PART5   3366650
10900   PART6   1548868
10920   PART3   4154075
10920   PART2   3404018
10920   PART1   3207571
10920   PART4   3178505
10920   PART6   1882924
10920   PART5   3363267
10940   PART6   2183534
10940   PART3   4153924
10940   PART4   3178554
10940   PART1   3207436
10940   PART5   3363585
10940   PART2   3404220

そして、ファイルを分割したい-最初に、最初の列で。次に、列 3 の合計が 10000000 を超えないようにします。

最初の列でファイルベースを分割するコードは次のとおりです。

file1=open ('Normal_All_TracNum_mod')
data=[]

for line in file1.readlines():
line_split=line.split()
data.append(line_split)

RCV_check= data[0][0]
filewrite=open(RCV_check,"w")

for i in range(0,len(data)):
    if (data[i][0] == RCV_check):
        filewrite.write(data[i][0]+ "          "+data[i][1]+'\n')

    else:
        RCV_check=data[i][0]
        filewrite.close()
        filewrite=open(RCV_check,"w")
        filewrite.write(data[i][0]+ "          "+data[i][1]+'\n')   
filewrite.close()

私が望むように出力:

File 1
 10900  PART1   3211034
 10900  PART2   3400458
 10900  PART4   3183857
File 2
 10900  PART3   4152115
 10900  PART5   3366650
 10900  PART6   1548868
...etc

各ファイルには、10000000 を超えない列 3 の同じ列 One And Summation (3211034 +3400458 + 3183857) が必要です。

4

3 に答える 3

2

を使用する 1 つの方法を次に示しawkます。

awk '{ s+=$3 } s>=10000000 || $1!=x { s=$3; c++ } { print > "File" c; x=$1 }' file

これにより、7 つのファイルが作成されます。grep . File*これらの各ファイルの内容を表示した出力は次のとおりです。

File1:10900   PART1   3211034
File1:10900   PART2   3400458
File1:10900   PART4   3183857
File2:10900   PART3   4152115
File2:10900   PART5   3366650
File2:10900   PART6   1548868
File3:10920   PART3   4154075
File3:10920   PART2   3404018
File4:10920   PART1   3207571
File4:10920   PART4   3178505
File4:10920   PART6   1882924
File5:10920   PART5   3363267
File6:10940   PART6   2183534
File6:10940   PART3   4153924
File6:10940   PART4   3178554
File7:10940   PART1   3207436
File7:10940   PART5   3363585
File7:10940   PART2   3404220
于 2012-11-23T01:47:26.263 に答える
0

最初の列で何をしたいのかわかりません。しかし、2番目の列の合計に対する制約を尊重するpythonがあります

fileID = itertools.count(1) infile として open('path/to/file') を使用: sum = 0 しきい値 = 10000000 outfile = open("file%d"%fileID, 'w')

for line in infile:
    val = int(line.strip().split()[-1])
    if threshold-sum >= val:
        outfile.write(line)
    else:
        outfile.close()
        sum = 0
        outfile = open("file%d"%next(fileID), 'w')
        outfile.write(line)

    sum += val

outfile.close()

お役に立てれば

于 2012-11-22T18:10:24.307 に答える
0

あなたの仕様を正しく取得できれば、ベローがうまくいくかもしれません。基本的に、2 番目のフィールドが 1000 より大きいかどうかをチェックし、そうであればfilec(cはカウンター) に出力し、2 番目のフィールドの合計をリセットし、ファイル カウンターなどをインクリメントします。

awk 'BEGIN {c=1}
     $3>10000000 {print $0 > ("file" c) ; c++ ; sum=0 } 
     $3< 10000000 {print $0 > ("file" c) ; sum+=$3 ; if (sum> 10000000) {sum=0;c++}}' INPUTFILE

最初の列と3 番目の列の合計で分割する場合:

awk 'NR==1 {f=$1; c=1 ; fname=f c ; s=$3 ; print $0 > (fname)}
     NR>1  {if ($1 != f) {f=$1 ; c=1 ; fname=f c; s=$3 } } 
     NR>1  {if (s<10000000) {print $0 > (fname); s+=$3} else {c++;fname=f c;s=$3; print $0 > (fname)} }' INPUTFILE  

そして、ええ、私はこれが短縮できることを知っています...

于 2012-11-22T17:56:42.347 に答える