在非常大的文件之前添加字符以发送到Shell脚本


0

我试图在31,65 Go json文件上运行shell脚本。

./oetl.sh database.json

我需要在文件前后加上括号。

我在database.json中拥有什么:

{..},{..},..

我想要的是 :

[{..},{..}..]

有什么方法可以执行此操作而无需编辑文件?如果没有,如何快速编辑文件?

我知道我可以快速回应右括号:

echo "]" >> database.json

如何添加左括号?

我不知道是否需要这样做,而且我是Shell脚本的新手,但这是oetl.sh文件:

#!/bin/sh
#
# Copyright (c) 2014 Luca Garulli
#

#set current working directory
cd `dirname $0`

# resolve links - $0 may be a softlink
PRG="$0"

while [ -h "$PRG" ]; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done

# Get standard environment variables
PRGDIR=`dirname "$PRG"`

# Only set ORIENTDB_HOME if not already set
[ -f "$ORIENTDB_HOME"/lib/orientdb-etl-@VERSION@.jar ] || ORIENTDB_HOME=`cd "$PRGDIR/.." ; pwd`
export ORIENTDB_HOME

# Set JavaHome if it exists
if [ -f "${JAVA_HOME}/bin/java" ]; then 
   JAVA=${JAVA_HOME}/bin/java
else
   JAVA=java
fi
export JAVA

ORIENTDB_SETTINGS="-Djava.util.logging.config.file="$ORIENTDB_HOME/config/orientdb-client-log.properties" -Djava.awt.headless=true"
JAVA_OPTS=-Xmx512m
KEYSTORE=$ORIENTDB_HOME/config/cert/orientdb-console.ks
KEYSTORE_PASS=password
TRUSTSTORE=$ORIENTDB_HOME/config/cert/orientdb-console.ts
TRUSTSTORE_PASS=password
SSL_OPTS="-Dclient.ssl.enabled=false -Djavax.net.ssl.keyStore=$KEYSTORE -Djavax.net.ssl.keyStorePassword=$KEYSTORE_PASS -Djavax.net.ssl.trustStore=$TRUSTSTORE -Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASS"

$JAVA -server $JAVA_OPTS $ORIENTDB_SETTINGS $SSL_OPTS -Dfile.encoding=utf-8 -Dorientdb.build.number="@BUILD@" -cp "$ORIENTDB_HOME/lib/*" com.orientechnologies.orient.etl.OETLProcessor $*

Answers:


2

创建一个包含所需内容的新文件。对于您的情况,可以这样进行:

echo "[" > database-new.json ; cat database.json >> database-new.json ; echo "]" >> database-new.json

>是创建新文件(如果存在则清除文件)并定向stdout到该文件。>>追加stdout到文件。


我打算回答相同的命令,但是添加了一条注释,说明要转移文件中的所有内容确实需要重写整个文件,因此无法解决。如果存在磁盘空间问题,则可以在同一个文件中执行此操作,但是必须以其他语言(例如C,PHP或许多其他语言)来完成,才能以读写模式打开文件。
朱莉·佩勒捷

@JuliePelletier如果您想尝试一个替代答案,我认为命名管道可以在不占用磁盘空间的情况下实现相同的目的。我不是很熟悉自己使用它们。
Ouroborus

哇,好吧,我没想过那个谢谢!这说得通。
AlexB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.