从多行sed输出创建sqlite3数据库

时间:2017-01-21 00:30:51

标签: bash sed sqlite

我正在运行:

sed -ne '/###SECTION-1###/,/###SECTION-2###/p file

它输出:

###SECTION-1###

ColumnA: 1a
ColumnB: 2b
ColumnC: 3c
ColumnA: Z9
ColumnB: Y8
ColumnC: X7

###SECTION-2###

我想使用上面的输出创建一个sqlite数据库,使它看起来像这样:

ColumnA  ColumnB  ColumnC
-------  -------  -------
1a       2b       3c
Z9       Y8       X7

我认为sqlite insert命令看起来如下所示,但我在从原始sed命令分配$ columna,$ columnb,$ columnc时遇到问题。

sqlite3 /tmp/test.db "INSERT OR IGNORE INTO data (ColumnA, ColumnB, ColumnC) values ('$columna', '$columnb', '$columnc');" 

如何分配$ columna,$ columnb,$ columnc?

2 个答案:

答案 0 :(得分:0)

您没有说您想使用contrived进行进一步处理,multiline replacements are not easy,但这是可能的。

首先,删除SECTION行。 然后将sed文本替换为SQL语句的相应部分:

ColumnX:

答案 1 :(得分:0)

我会用awk做到这一点,它比sed更容易阅读(和写)恕我直言:

awk '/^ColumnA:/{a=$2}
     /^ColumnB:/{b=$2}
     /^ColumnC:/{c=$2; printf("sqlite2 /tmp/test/db \"INSERT (ColumnA,ColumnB,ColumnC) values ('\''%s'\'','\''%s'\'','\''%s'\'');\"\n",a,b,c)}' file.txt

因此,当我们看到以"ColumnA:"开头的行时,我们将第二个字段另存为a。当我们看到以"ColumnB:"开头的行时,我们将第二个字段另存为b。当我们看到以"ColumnC:"开头的行时,我们将第二个字段保存为c并打印SQL内容(为了清晰起见,我将其缩写。

示例输出

sqlite2 /tmp/test/db "INSERT (ColumnA,ColumnB,ColumnC) values ('1a','2b','3c');"
sqlite2 /tmp/test/db "INSERT (ColumnA,ColumnB,ColumnC) values ('Z9','Y8','X7');"

或者作为一个单行:

awk '/^ColumnA:/{a=$2} /^ColumnB:/{b=$2} /^ColumnC:/{c=$2; printf("sqlite2 /tmp/test/db \"INSERT (ColumnA,ColumnB,ColumnC) values ('\''%s'\'','\''%s'\'','\''%s'\'');\"\n",a,b,c)}' file.txt 

如果看起来正确,您可以将输出发送到bash以进行实际执行:

awk '{...}' file.txt | bash