2010-08-23 3 views
2

전역 검색을 수행하고 구분 문자를 대체하는 데 필요한 상대적으로 큰 csv/text 데이터 파일 (33MB)이 ​​있습니다. (이유는 SQLServer가 테이블 내보내기 중에 데이터에서 큰 따옴표를 이스케이프 처리하거나 처리하는 방법이 아닌 것 같지만 다른 이야기입니다 ...)큰 txt 파일을 효율적으로 검색/바꾸는 방법은 무엇입니까?

텍스트 검색을 성공적으로 수행했으며 작은 파일을 대체하지만이 큰 파일은 질식합니다.

해답이 될 수 있습니다 명령 줄 그렙 것 같아,하지만 난 꽤 구문, ALA 파악 할 수 없습니다

grep -rl OLDSTRING . | xargs perl -pi~ -e ‘s/OLDSTRING/NEWSTRING/’ 

그래서 내 경우에는 내가 '^'(캐럿) 찾고 있어요를 문자 (doublequote) '' '로 대체. 작동하지 않습니다와 나는 그것이 doublequote 또는 무언가의 이스케이프과 관련이있다 있으리라 믿고있어,하지만 난 꽤 잃었어요

grep -rl " grep_test.txt | xargs perl -pi~ -e 's/"/^' 

. 누구든지 도와 줄 수 있습니까?

는 (사람이 SQLServer2005은 CSV로 내보내는 동안 텍스트 열에서 따옴표를 처리하는 얻는 방법을 알고 있다면 내가 생각, 그건 정말 핵심 문제를 해결할 것입니다.)

답변

3

펄 대체가 잘못된 것 같다. 시도 :

grep -rl \" . | xargs perl -pi~ -e 's/\^/"/g' 

설명 :

grep : command to find matches 
-r : to recursively search 
-l : to print only the file names where match is found 
\" : we need to escape " as its a shell meta char 
. : do the search in current working dir 
perl : used here to do the inplace replacement 
-i~ : to do the replacement inplace and create a backup file with extension ~ 
-p : to print each line after replacement 
-e : one line program 
\^ : we need to escape caret as its a regex meta char to mean start anchor 
+0

두 사람 모두 효과가 있으며 명확하게 설명하는 데 도움이되었습니다. 고마워요! –

+0

오, 그래 전 그걸하기에 충분한 '포인트'가 없었어. 감사. –

2
sed -i.bak 's/\^/"/g' mylargefile.csv 

업데이트 : 고삐가

perl -i.bak -pe 's/\^/"/g' mylargefile.csv 

그러나 큰 파일에 대한

을 제안했다 당신은 빠른 비트를 실행할 수 있습니다 나오지도, 펄을 사용할 수 있습니다 내 결과가 600 만 줄 파일에 표시되는 Perl보다

$ tail -4 file 
this is a line with^
this is a line with^
this is a line with^

$ wc -l<file 
6136650 

$ time sed 's/\^/"/g' file >/dev/null 

real 0m14.210s 
user 0m12.986s 
sys  0m0.323s 
$ time perl -pe 's/\^/"/g' file >/dev/null 

real 0m23.993s 
user 0m22.608s 
sys  0m0.630s 
$ time sed 's/\^/"/g' file >/dev/null 

real 0m13.598s 
user 0m12.680s 
sys  0m0.362s 

$ time perl -pe 's/\^/"/g' file >/dev/null 

real 0m23.690s 
user 0m22.502s 
sys  0m0.393s 
+0

도움에 감사드립니다. 나는 sed를 사용한 적이 없지만, 그것이 간결하다면 그것은 가치가있을 것입니다. :) –

+1

perl -i.bak -pe 's/\ ^/"/ g"mylargefile.csv가 그다지 길지는 않습니다 ... – reinierpost

관련 문제