如何拆分文件

时间:2012-11-22 16:46:50

标签: python awk

我有这种格式的文本文件:

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

我需要在每个文件中有第3列的相同列One和Summation(3211034 +3400458 + 3183857)不大于10000000,依此类推其他文件.............

3 个答案:

答案 0 :(得分:2)

这是使用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

答案 1 :(得分:0)

如果我的说明正确,下面的声音可能对您有用。基本上它检查第二个字段是否大于1000,如果是,则将其打印到filecc是计数器)然后重置第二个字段的总和并递增文件计数器等。

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

如果你想在第三个柱子的总和上拆分第一个柱子

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  

是的,我知道这可以缩短......

答案 2 :(得分:0)

我不明白你想要用第一列做什么。但是,这里有一些python尊重第二列总和的约束

fileID = itertools.count(1) 使用open('path / to / file')作为infile:     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()

希望这有帮助