Sed操作仅适用于较小的文件

时间:2016-03-07 12:15:09

标签: sed ubuntu-14.04

操作系统:Ubuntu 14.04

我有12个大型json文件(每个2-4 GB)我想要执行不同的操作。我想删除第一行,找到"},"并将其替换为"}"并删除所有"]"。

我使用sed来执行操作,我的命令是:

sed -i.bak -e '1d' -e 's/},/}/g' -e '/]/d' file.json

当我在一个小文件(12,7kb)上运行该命令时,它工作正常。 file.json包含带有更改的内容,file.json.bak包含原始内容。

但是当我在较大的文件上运行命令时,原始文件被清空,例如file.json为空,file.json.bak包含原始内容。运行时间也是我认为的快速",大约2-3秒。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您确定您的输入文件包含您正在运行命令的平台所识别的换行符吗?如果没有,则删除一行将删除整个文件。 wc -l < file告诉你什么?

如果不是那么你可能没有足够的文件空间来复制文件,所以sed正在内部做一些事情,如

mv file backup && sed '...' backup > file

但在将原始文件移动到备份后没有空间来创建新文件。检查您的可用文件空间,如果您没有足够的文件空间并且无法获得更多文件空间,那么您需要执行以下操作:

while [ -s oldfile ]
do
    copy first N bytes of oldfile into tmpfile &&
    remove first N bytes from oldfile using real inplace editing &&
    sed 'script' tmpfile >> newfile &&
    rm -f tmpfile
done
mv newfile oldfile

有关如何从文件中删除前N个字节的信息,请参阅https://stackoverflow.com/a/17331179/1745001。选择适合您可用空间的N的最大值。