2013-12-20 97 views
4

我tryed像這樣轉換大量的MySQL轉儲文件,CSV

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 

在此先感謝!

+0

你的意思是'data_1'像'「一些數據」'用雙引號或單引號? –

+0

還是你的意思是'data_1,data_2'就像''data_1,data_2''? –

+0

Sry我編輯過,我的''',一定是誤導了你......我需要N(data_1,data_2)夫婦出現在每一行,不僅是第一個......我的錯誤 – Syffys

回答

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] 
    } 
} 
+0

剛剛更新,測試,thx! – Syffys

+0

當我嘗試在一行中執行它時: gawk'/^INSERT/{line = $ 0; while(match(line,/ [^(] * \(([^)] *)\)/,a )){; cur = a [1]; sub(/^[\'「] /,」「,cur); sub(/ [\'」] $ /,「」,cur); print cur; line = substr(line,RSTART + RLENGTH)}}'input.sql 我得到以下內容:-bash:語法錯誤附近的意外令牌')' 可能有些引號應該被轉義? – Syffys

+0

@Syffys Ok ..嘗試將awk腳本放在'f.awk'文件中,然後執行'awk -f f.awk input.sql' .. –

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 

根據您的(新)樣品

+1

對不起,正如我所說,我一定是用我的'...'誤導了你,我更新了我的樣本。謝謝! – Syffys