按行前缀拆分文件

按行前缀拆分文件

我的数据如下:

60  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
61  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
64  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

我想通过行前缀将其拆分为单独的文件..如下所示:

file 60 contains all lines prefixed with "60"
file 61 contains all lines prefixed with "61"
...

到目前为止,我想到最好的办法是 grep 所有的行前缀,然后循环遍历,并把每个行前缀 grep 到单独的文件中,但这是一个相当大的文件,所以这可能需要很长时间。也许有比循环和 grep 更好的方法?某种 grep 分组方法?我知道有一种将文件切分的方法,如果每个部分之间有标记,比如 --- 但我也不完全确定这是最好的方法。

答案1

如果输入文件名为data,则一种解决方案是:

awk '{print>$1}' data

在 中awk,第一个字段(列)称为$1。上面的代码循环遍历输入的每一行(awk隐式执行此操作)并将该行写入名为第一个字段的文件中。

更详细地:

  • 该命令放在括号中。由于括号前没有限定符,因此该命令将在每一行输入上运行。

  • 该命令print不带参数,将打印整个输入行。

  • 该符号>表示将输出重定向到文件

  • 文件名被指定为$1,再次引用输入行第一个字段中的任何文本。

因此,该命令将创建名为60, 61等的文件,其中包含输入文件中的相应行。

处理非常大的数据集

默认情况下,awk保持所有文件句柄打开,直到整个命令完成。因此,对于非常大的数据集,可能会超出系统对打开文件数量的限制。最简单的解决方案是在写入后使用附加并关闭每个文件:

awk '{print>>$1; close($1)}' data

由于使用了>>(append),因此会添加到现有数据文件而不是覆盖它们。如果这不是您想要的,请在运行此命令之前删除它们。

相关内容