【问题标题】:Split file without separating rows beginning with like values in Unix拆分文件而不分隔在 Unix 中以类似值开头的行
【发布时间】:2018-10-24 13:39:51
【问题描述】:

我有一个排序后的 .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

我想将文件拆分为每个大约两行的较小文件,但我不希望将第一列中具有相似值的行分开。

在这里,我最终会得到三个文件:

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 gigs,包含超过 1 亿行。我想将其拆分为每个约 100K 行或约 6MB 的文件。我可以使用文件大小或行号进行拆分。

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

split -a 5 -d -1 2

在这里,这将给我四个文件,并且在大多数情况下,第一列中的类似值将被拆分为文件。

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

感谢您的帮助!谢谢!

【问题讨论】:

    标签: unix awk split gawk


    【解决方案1】:

    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 块设置初始输出文件名(读取第一行时)。


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

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

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

    【讨论】:

    • 这是非常直接的代码,您的解释非常有帮助。非常感谢您的宝贵时间!
    【解决方案2】:

    如果可用,使用 csplit

    使用给定的数据

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2019-04-21
      • 2012-05-24
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多