Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Unix中拆分文件而不分隔以相似值开头的行_Unix_Awk_Split_Gawk - Fatal编程技术网

在Unix中拆分文件而不分隔以相似值开头的行

在Unix中拆分文件而不分隔以相似值开头的行,unix,awk,split,gawk,Unix,Awk,Split,Gawk,我有一个排序的.csv文件,类似于: AABB1122,ABC,BLAH,4 AABB1122,ACD,WHATEVER,1 AABB1122,AGT,CAT,4 CCDD4444,AYT,DOG,4 CCDD4444,ACG,MUMMY,8 CCEE4444,AOP,RUN,5 DDFF9900,TUI,SAT,33 DDFF9900,WWW,INDOOR,5 我希望将文件拆分为较小的文件,每个文件大约有两行,但我不希望将第一列中具有相同值的行分隔开 在这里,我将得到三个文件: $ awk

我有一个排序的.csv文件,类似于:

AABB1122,ABC,BLAH,4
AABB1122,ACD,WHATEVER,1
AABB1122,AGT,CAT,4
CCDD4444,AYT,DOG,4
CCDD4444,ACG,MUMMY,8
CCEE4444,AOP,RUN,5
DDFF9900,TUI,SAT,33
DDFF9900,WWW,INDOOR,5
我希望将文件拆分为较小的文件,每个文件大约有两行,但我不希望将第一列中具有相同值的行分隔开

在这里,我将得到三个文件:

$ awk -f script.awk file.csv

$ cat 000001-AABB1122.txt
AABB1122,ABC,BLAH,4
AABB1122,ACD,WHATEVER,1
AABB1122,AGT,CAT,4

$ cat 000004-CCDD4444.txt
CCDD4444,AYT,DOG,4
CCDD4444,ACG,MUMMY,8

$ cat 000006-CCEE4444.txt
CCEE4444,AOP,RUN,5
DDFF9900,TUI,SAT,33
DDFF9900,WWW,INDOOR,5
x00000:

AABB1122,ABC,BLAH,4
AABB1122,ACD,WHATEVER,1
AABB1122,AGT,CAT,4
x00001:

CCDD4444,AYT,DOG,4
CCDD4444,ACG,MUMMY,8
x00002:

CCEE4444,AOP,RUN,5
DDFF9900,TUI,SAT,33
DDFF9900,WWW,INDOOR,5 
我的实际数据大小约为7千兆,包含超过1亿行。我想把它分成大约100K行或~6MB的文件。我可以使用文件大小或行号进行拆分

我知道我可以使用“排序”进行拆分,例如:

split -a 5 -d -1 2
在这里,这将给我四个文件,和第一列中的值一样,在大多数情况下,这些值将被拆分为多个文件

我想我可能需要awk,但是,即使在阅读了手册之后,我也不知道如何继续


谢谢你的帮助!谢谢

一个
awk
脚本:

BEGIN   { FS = ","  }
!name   { name = sprintf("%06d-%s.txt", NR, $1) }

count >= 2 && prev != $1  {
    close(name)
    name = sprintf("%06d-%s.txt", NR, $1)
    count = 0
}

{
    print >name
    prev = $1
    ++count
}
在给定数据上运行此操作将创建三个文件:

$ awk -f script.awk file.csv

$ cat 000001-AABB1122.txt
AABB1122,ABC,BLAH,4
AABB1122,ACD,WHATEVER,1
AABB1122,AGT,CAT,4

$ cat 000004-CCDD4444.txt
CCDD4444,AYT,DOG,4
CCDD4444,ACG,MUMMY,8

$ cat 000006-CCEE4444.txt
CCEE4444,AOP,RUN,5
DDFF9900,TUI,SAT,33
DDFF9900,WWW,INDOOR,5
我任意选择使用原始文件中第一行的行号,以及该行上第一个字段的数据作为文件名

脚本统计打印到当前输出文件的行数,如果该数字大于或等于2,并且如果第一个字段的值不同于前一行的第一个字段,则关闭当前输出文件,构造新的输出名称,并重置计数

最后一个块只是打印到当前文件名,记住
prev
变量中的第一个字段,并增加计数

BEGIN
块初始化字段分隔符(在读取第一行之前)和
!name
block设置初始输出文件名(读取第一行时)


要准确获取问题中的文件名,请使用

name = sprintf("x%05d", ++n)

要在执行此操作的两个位置设置输出文件名。

一个
awk
脚本:

BEGIN   { FS = ","  }
!name   { name = sprintf("%06d-%s.txt", NR, $1) }

count >= 2 && prev != $1  {
    close(name)
    name = sprintf("%06d-%s.txt", NR, $1)
    count = 0
}

{
    print >name
    prev = $1
    ++count
}
在给定数据上运行此操作将创建三个文件:

$ awk -f script.awk file.csv

$ cat 000001-AABB1122.txt
AABB1122,ABC,BLAH,4
AABB1122,ACD,WHATEVER,1
AABB1122,AGT,CAT,4

$ cat 000004-CCDD4444.txt
CCDD4444,AYT,DOG,4
CCDD4444,ACG,MUMMY,8

$ cat 000006-CCEE4444.txt
CCEE4444,AOP,RUN,5
DDFF9900,TUI,SAT,33
DDFF9900,WWW,INDOOR,5
我任意选择使用原始文件中第一行的行号,以及该行上第一个字段的数据作为文件名

脚本统计打印到当前输出文件的行数,如果该数字大于或等于2,并且如果第一个字段的值不同于前一行的第一个字段,则关闭当前输出文件,构造新的输出名称,并重置计数

最后一个块只是打印到当前文件名,记住
prev
变量中的第一个字段,并增加计数

BEGIN
块初始化字段分隔符(在读取第一行之前)和
!name
block设置初始输出文件名(读取第一行时)


要准确获取问题中的文件名,请使用

name = sprintf("x%05d", ++n)

在完成此操作的两个位置设置输出文件名。

如果可用,请使用csplit

用给定的数据

csplit -s infile %^A% /^C/ %^C% /^D/ /^Z/ {*}

如果可用,请使用csplit

用给定的数据

csplit -s infile %^A% /^C/ %^C% /^D/ /^Z/ {*}

这是非常直接的代码,您的解释非常有用。非常感谢您抽出时间!这是非常直接的代码,您的解释非常有用。非常感谢您抽出时间!