操作系统: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秒。
我在这里做错了什么?
答案 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的最大值。