매 특정 줄(100줄??) 마다 문자열 삽입하기?

kwon37xi의 이미지

제가 유지보수 하고 있는 시스템에서요, 가끔, 사용자들이 엑셀로 몇만 줄짜리 데이터를 보내주면
그걸 INSERT 혹은 UPDATE 문으로 만들어서 DB를 조작하고 하는 일을 합니다.

엑셀 데이터를 쿼리로 바꾸는 것은 뭐 쉽게 됩니다. VI 에서 정규식 써서요.
근데, 데이터를 삽입할께 몇만줄일 경우,
중간 중간 커밋을 안해주면 삽입 속도가 매우 느려져서요...
중간 중간 커밋을 해주려고 하는데요,

예를들어 매 1000 줄마다, 1001번째 줄에 COMMIT; 문을 넣고, 그리고 그 다음 2001줄(실제로는 앞의 COMMIT 문 때문에 2002줄이 되겠죠??)에 COMMIT; 넣고 이런 걸 하고 싶은데요..
VI 혹은 UNIX 명령어를 통해서 그런 작업을 할 수 있는지요?

sed 를 써서 1000 줄 뒤에 COMMIT; 넣는것은 했는데요, 이게, 그 다음번 1000 줄 뒤에는 안들어가더군요..(제가 알아낸 한계입니다... ㅜㅜ)

방법이 있을까요?

lazycoder의 이미지

emacs 사용자라면..

편집할때 반복적인 규칙이 있다면 저는 매크로를 씁니다.
대충 짜보면..

# 1차수정 ;
C-x (
 
ESC 1000 C-n
 
엔터
 
C-p
 
COMMIT;
 
C-n
 
C-a
 
C-x )
 
C-u C-x e

정도 되겠네요.

내공이 좀 있으면 함수도 하나 만들어질것 같은데..

cinsk의 이미지

$ cat tmp.txt12345678$ awk

$ cat tmp.txt
1
2
3
4
5
6
7
8
$ awk 'NR % 4 == 1 { print "COMMIT;" } { print $0 }' tmp.txt
1
2
3
4
COMMIT;
5
6
7
8
COMMIT;
$ _

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

kwon37xi의 이미지

혹~~

감사합니다.
Emacs도 좋겠지만, 제가 안써서요, 테스트는 못했봤고요,
awk 너무 잘 되네요.
awk도 공부해봐야 겠네요.
잘 쓰겠습니다.

http://kwon37xi.egloos.com

kz의 이미지

뒷북..-_-

자삭.

윤봉환의 이미지

Re: 뒷북

허탈한 일이지요..
kldp에서는 드문 일이 아닙니다^^..

放下着-----
내려놓으려는 마음도 내려놓기

윤봉환의 이미지

굳이 VIM에서 해야겠다면

:%s/\(.*$\n\)\{1000}/&commit;\r/

newline 문자를 1000번 만날 때마다 commit;을 넣으라는 뜻이지요.
흠.. 테스트해보니 1000 단위에서는 좀 느리군요..

다른 방법으로는,

:.+1000 s/^/commit\r/

위 명령으로 한 번 치환한 다음,
'.'(마침표)를 계속 누르는 겁니다.. 파일이 끝날 때까지(흠.. 노가다에 가까와서 왠지)

역시 폼이 안나네요. 아무래도 GAWK 가 좋겠습니다.

放下着-----
내려놓으려는 마음도 내려놓기

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.