将大文件拆分为具有条件的小文件

时间:2015-10-22 20:30:20

标签: bash file unix split

您尝试在很多较小的文件中拆分一个大的file.dat(120 Mb)。

我知道split命令应该为我做这个,让我们说:

split --lines=#number file.dat

这会将我的大文件划分为多个具有相同行数(#number)的文件。

如果我想要一个if-like条件来分割文件,我该怎么办呢?

例如:我想在第一列的整数部分与先前的不同时划分该文件。

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个不同的文件,第一个有前两行;第二个有四条线;第三个有一条线,依此类推。 这可能吗?谢谢大家。

2 个答案:

答案 0 :(得分:2)

要求救援!

$ 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"}

答案 1 :(得分:0)

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

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

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

请注意,上述代码需要进行一些调整以适用于您的情况,但它应该足以让您入门。