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

mar*_*ria 0 python unix bash awk sed

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

test_file里面

a   b
a   c
a   d
b   a
b   b
a   g
a   j
c   g
Run Code Online (Sandbox Code Playgroud)

我试图根据第一个字段将其拆分为多个文件.但是,重复但不连续的值应该创建一个新文件(即每次字段1中的值相应于前一行时,应生成一个新文件).所以,在我之前的例子中,行:

a   g
a   j
Run Code Online (Sandbox Code Playgroud)

应该转到与以下文件不同的新文件:

a   b
a   c
a   d
Run Code Online (Sandbox Code Playgroud)

最后,我将有4个文件,每个文件代表第一个字段中的一个变化:

A.1

a   b
a   c
a   d
Run Code Online (Sandbox Code Playgroud)

B.2

b   a
b   b
Run Code Online (Sandbox Code Playgroud)

A.3

a   g
a   j
Run Code Online (Sandbox Code Playgroud)

C.4

c   g
Run Code Online (Sandbox Code Playgroud)

实际上,如果标识符是:a.1,b.1,a.2,c.1或任何其他类型的后缀,它也会起作用.我想避免所述第二子集/组的一个值来替换/覆盖与所述第一组的所产生的前一个文件一个值.我也不想,所有的一个值附加到同一个文件.

我知道:

awk '{print > $1; close( $1)}' test_file
Run Code Online (Sandbox Code Playgroud)

将使用第一列拆分,但它也会在键相等时将结果附加到同一文件.

为了避免这个问题,我想添加另一个真正不同的字段.就像是:

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
Run Code Online (Sandbox Code Playgroud)

然后做:

 awk '{print > $1"_"$2; close( $1"_"$2) }' test_file
Run Code Online (Sandbox Code Playgroud)

但我真的找不到办法,因为我认为关联数组在这种情况下不起作用.任何的想法?

Ed *_*ton 5

听起来你可能想要这个:

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

但你的问题并不完全清楚.