根据字段拆分大文件,并为每个fi添加唯一标识符

2024-09-30 16:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的(巨大)文件:

测试_文件

a   b
a   c
a   d
b   a
b   b
a   g
a   j
c   g

我试着根据第一个字段把它分成多个文件。但是,重复而非连续的值应创建一个新文件(即,每当字段1中的值分别更改为上一行时,应生成一个新文件)。因此,在前面的示例中,行:

^{pr2}$

应转到一个不同于具有以下内容的新文件:

a   b
a   c
a   d

每个字段中有一个文件的更改,表示其中一个文件的末尾:

a.1

a   b
a   c
a   d

b.2节

b   a
b   b

a.3

^{pr2}$

c.4款

c   g

实际上,如果标识符是:a.1、b.1、a.2、c.1或任何其他类型的后缀,它也可以工作。我希望避免第二个子集/组的a值来替换/覆盖第一组a值生成的前一个文件。我也不希望所有的a值都附加到同一个文件中。在

我知道:

awk '{print > $1; close( $1)}' test_file

将使用第一列进行拆分,但当键相等时,它还会将结果追加到同一个文件中。在

为了避免这个问题,我考虑添加另一个真正不同的字段。比如:

测试_文件

1    a  b
1    a  c
1    a  d
2    b  a
2    b  b
3    a  g
3    a  j
4    c  g

然后做:

 awk '{print > $1"_"$2; close( $1"_"$2) }' test_file

但我真的找不到一个方法,因为我认为在这种情况下,关联数组不起作用。有什么想法吗?在


Tags: 文件方法test示例类型close标识符后缀
3条回答

在Python2.x中,可以使用groupby完成此操作,如下所示:

import csv
from itertools import groupby

with open('huge.txt', 'rb') as f_input:
    csv_input = csv.reader(f_input, delimiter=' ', skipinitialspace=True)

    for index, (k, g) in enumerate(groupby(csv_input, lambda x: x[0]), start=1):
        with open('{}.{}'.format(k, index), 'wb') as f_output:
            csv.writer(f_output, delimiter=' ').writerows(g)

如果您使用的是Python 3.x:

^{pr2}$

Awk真的很简单,不是吗?在

#!/usr/bin/env python
files_count = 1
first_col = None
with open('maria.txt') as maria:
    for line in maria:
        line = line.rstrip()
        columns = line.split()
        if columns[0] == first_col:
            print (line, file=current_out)
        else:
            first_col = columns[0]
            current_out = open(first_col+'.'+str(files_count), 'w')
            files_count+=1
            print (line, file=current_out)

听起来你可能想要这个:

awk '$1!=prev{ close(out); out="File_"$1"."(++cnt); prev=$1 } { print > out }' test_file

你的问题不太清楚,但不是很清楚。在

相关问题 更多 >