CSV

2013-12-20 5 views
4

에 대규모 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 

같은 것을 tryed 그러나 나는 느리고 최적화되지 않은

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 I edit, 내 '...', 당신을 오도 한 것 같아요. 첫 번째뿐만 아니라 각 줄에 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

방금 ​​업데이트를 받았고 테스트했습니다. – Syffys

+0

한 줄로 실행하려고하면 : gawk '/^INSERT/{line = $ 0; while (일치하는 줄,/[^ (] * \ ((^)) *) \) /, 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