您尝试在很多较小的文件中拆分一个大的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个不同的文件,第一个有前两行;第二个有四条线;第三个有一条线,依此类推。 这可能吗?谢谢大家。
答案 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
请注意,上述代码需要进行一些调整以适用于您的情况,但它应该足以让您入门。