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

Syf*_*fys 5 mysql bash awk sed

我尝试过这样的事情

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
Run Code Online (Sandbox Code Playgroud)

但我发现它缓慢且未经优化

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');
Run Code Online (Sandbox Code Playgroud)

我的目标是获取具有以下结果的文件(并且没有'或'来封闭字段):

data_1,data_2
data_1,data_2
...
data_1,data_2
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Håk*_*and 1

你可以试试:

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

* 更新 *

再次阅读问题后,也许这更符合您的要求:

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

*更新2*

根据问题的最后更新,这里有一个新版本:

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