【问题标题】:split large file into small files with condition将大文件拆分为有条件的小文件
【发布时间】:2015-10-22 20:30:19
【问题描述】:

您好,尝试将一个大文件.dat (120 Mb) 拆分为许多小文件。

我知道split 命令应该为我执行此操作,比如说:

split --lines=#number file.dat

但是这会将我的大文件分成许多具有相同行数(#number)的文件。

如果我想要一个类似 if 的条件来分割文件,我该怎么做?

例如:当第一列的整数部分与前一个不同时,我想分割这个文件。

file.dat 示例应该是:

1.2 432.1 87.1
1.3  3.5 557.2
2.1 1.2 43.56
2.33 19.2 34.7
2.4 32.6 41.8
2.56 23.5 66.9
4.1 143.7  54.0
5.5 432.8 23.4
6.7 423.9 0.3

在这个例子中,我应该有 5 个不同的文件,第一个包含前两行;第二个有四行;第三个用一根线,依此类推。 这可能吗?谢谢大家。

【问题讨论】:

  • 您希望您的完整数据集创建多少个输出文件?

标签: bash file unix split


【解决方案1】:

求救!

$ awk '    NR==1{p=int($1);c=1} 
      int($1)==p{print > "file"c".seq";next} 
                {p=int($1);c++;print > "file"c".seq"}' input


$ ls file*.seq
file1.seq  file2.seq  file3.seq  file4.seq  file5.seq

$ cat file*.seq
1.2 432.1 87.1
1.3  3.5 557.2
2.1 1.2 43.56
2.33 19.2 34.7
2.4 32.6 41.8
2.56 23.5 66.9
4.1 143.7  54.0
5.5 432.8 23.4
6.7 423.9 0.3

$ wc -l file*.seq
  2 file1.seq
  4 file2.seq
  1 file3.seq
  1 file4.seq
  1 file5.seq
  9 total

当打开的文件过多时,您需要一次关闭它们。改变

{p=int($1);c++;print > "file"c".seq"}

{close("file"c".seq");p=int($1);c++;print > "file"c".seq"}

【讨论】:

  • 完美但不幸的是它对我说:awk: cannot open "file1021.seq" for output (Too many open files)
  • 如果文件在该范围内,则必须关闭文件。
【解决方案2】:

假设您不是在寻找 pure bash,awk 可以将打印语句重定向到单个文件。

例如,您可以根据第一个字段的值重定向到文件:

awk '{
    outfile = $1 ".txt"
    print $0 > outfile
}' input_file.txt

请注意,上面的代码需要一些调整才能在您的情况下工作,但这应该足以让您开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多