我的数据如下:
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),因此会添加到现有数据文件而不是覆盖它们。如果这不是您想要的,请在运行此命令之前删除它们。