将大量MySQL转储文件转换为CSV

时间:2013-12-20 09:44:32

标签: mysql bash sed awk

我尝试了类似的东西

awk -F " " '{if($1=="INSERT"){print $5}}' input.sql | \
    sed -e "s/^(//g" -e "s/),(/\n/g" -e "s/['\"]//g" \
        -e "s/);$//g" -e "s/,/;/g" > output.txt

但我发现它很慢且没有优化

MySQL转储文件如下所示

CREATE TABLE MyTable{
    data_1,
    data_2
};

INSERT INTO MyTAble VALUES ('data_1','data_2'),...,('data_1','data_2');
INSERT INTO MyTAble VALUES ('data_1','data_2'),...,('data_1','data_2');
...
INSERT INTO MyTAble VALUES ('data_1','data_2'),...,('data_1','data_2');

我的目标是获取一个包含以下结果的文件(并且没有'或'来包含字段):

data_1,data_2
data_1,data_2
...
data_1,data_2

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试:

gawk '/^INSERT/ {
    match ($0,/[^(]*\(([^)]*)\)/,a)
    print a[1]
}' input.sql

*更新*

再次阅读问题之后,也许这就是你想要的更多:

/^INSERT/ {
    line=$0
    while (match (line,/[^(]*\(([^)]*)\)/,a)) {
        cur=a[1]
        sub(/^['"]/,"",cur)
        sub(/['"]$/,"",cur)
        print cur
        line=substr(line,RSTART+RLENGTH)
    }
}

*更新2 *

根据问题的上次更新,这是一个新版本:

/^INSERT/ {
    line=$0
    while (match (line,/[^(]*\(([^)]*)\)/,a)) {
        line=substr(line,RSTART+RLENGTH)
        match(a[1],/'([^']*)','([^']*)'/,b)
        print b[1]
        print b[2]
    }
}

答案 1 :(得分:1)

sed -n "/.*INSERT INTO MyTAble VALUES (\([^)]*\)).*/ {
   s/.*INSERT INTO MyTAble VALUES \(.*\);/\1/
   s/(\([^)]*\)),*/\\1\\
/g
   s/'//g
   s/\\n$//
   p
   }" input.sql > output.sql

基于您的(新)样本