Python 如何分割文件
我有以下格式的文本文件:Python 如何分割文件,python,awk,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 31785
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
我需要在每个文件中有相同的第1列和第3列的总和(3211034+3400458+3183857),不大于10000000,以此类推,用于其他文件 如果我没有弄错您的规格,下面的吼声可能适合您。基本上,它检查第二个字段是否大于1000,如果大于1000,则将其打印到
filec
(c
是计数器),然后重置第二个字段的总和并递增文件计数器,等等
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'开始{c=1}
3美元> 10000000 {打印0美元>(文件)C;C++;求和=0 }
$3<10000000{print$0>(“文件”c);sum+=3;if(sum>10000000){sum=0;c++}}'INPUTFILE
如果要在第一列D和第三列D的总和上拆分:
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
awk'NR==1{f=$1;c=1;fname=fc;s=$3;print$0>(fname)}
NR>1{if($1!=f){f=$1;c=1;fname=fc;s=$3}}
NR>1{if(s(fname);s+=$3}else{c++;fname=fc;s=$3;print$0>(fname)}'输入文件
是的,我知道这可以缩短…我不明白你想对第一列做什么。但是,这里有一些python尊重对第二列和的约束 fileID=itertools.count(1) 以open('path/to/file')作为填充: 总和=0 阈值=10000000 outfile=open(“文件%d”%fileID,“w”)
希望这有帮助这里有一种使用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
请完成你的句子“最后我…”我不明白你的问题。你想如何分割列,以及确定哪些行写入哪个文件的标准是什么?我不太明白分割的逻辑。为什么在文件2中你还有一个path1对象?你不想在不同的文件中分离它们吗?第一个标准是第一列,第二个标准是秒ond colume并没有在每个文件中超过x个数字…第二个colume的总和并没有超过x个数字,,,我希望这能说明清楚…不要试图在评论中放入格式化文本,因为它不会起作用,如果有更多的事情要说,就编辑你的原始帖子,看起来好像有。你似乎在做额外的工作:
awk'BEGIN{c=1}{sum+=$3;if(sum>10000000){sum=0;c++};print>FILENAME.“.c}”
Yep,这是我在Glenjackman的第一个想法,但问题是“我需要在每个文件中有相同的列1,并且对于其他文件,列3的总和(3211034+3400458+3183857)不大于10000000,以此类推……”(并且它被编辑了几次…)答案已更正,现在可以正常工作。一个小提示@Majid阅读常见问题解答@,如果答案有帮助,就投票给它,如果它解决了你的问题,就接受它。cat File*
似乎比grep.File*
更自然地显示文件的内容。@willampersell:谢谢,伙计。不幸的是,我认为cat
显示不了他是谁?
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