2010-06-22 2 views
1

거대한 # 텍스트 파일 (100MB에서 1GB까지)에 대해 작업 중이며,이를 분석하여 particoular 데이터를 추출해야합니다. 성가신 일은 파일에 명확하게 구분 된 구분 기호가 없다는 것입니다. 예를 들어sed로 지저분한 로그를 파싱하는 불확실한 구분자

: 나는에 의해 제한 문자열의 공백을 삭제해야

"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element" 

"외부 따옴표 (그렇지 않으면 몇 가지 숫자를"(따옴표)는, 문제는 내가 공백 삭제되지해야한다는 것입니다 " 괜찮은 해결책을 찾을 수 없습니까? 누군가가 이것을 도와 줄 수 있습니까?

답변

3

awk를 사용해야합니다. sed가 아닙니다. awk은 이미 GB 파일에서도 파일 처리를 수행하는 훌륭한 C 프로그램이므로 직접 C 프로그램을 만들 필요가 없습니다. 그래서 일자리를 구하는 라이너가 하나 있습니다.

$ more file 
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element" 

$ awk -F'"' '{for(i=2;i<=NF;i+=2) {gsub(/ +/,"",$i)}}1' OFS='"' file 
"element" 123124 16758 "12.4" "element" "elementwithwhitespacesinside" "element" 
+0

그게 내 문제를 해결했습니다. 마지막 요청 일 뿐이에요, 코드를 설명해 주시겠습니까? 필드 구분 기호로 큰 따옴표를 설정하여 대단히 감사합니다 (awk에 익숙하지 않음) – Abaco

+0

따옴표 안에있는 단어는 짝수 필드 번호를 갖습니다. 따라서'i' 카운터는 2 씩 증가합니다.'gsub()'는 모든 공백을 null로 대체합니다. Pls는 gawk 매뉴얼 (검색 GNU awk)을 더 많은 정보 – ghostdog74

+0

+1 매우 똑똑한 해결책을 읽습니다. –

1

나는 작은 응용 프로그램을 작성하는 것이 더 나을지도 모르지만, sed 솔루션을 생각해 낼 수는 없습니다. 이.

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    while(getline(cin,line)) { 
     bool inquot = false; 
     for(string::iterator i = line.begin(); i != line.end(); i++) { 
      char c = *i; 
      if (c == '"') inquot = !inquot; 

      if (c != ' ' || !inquot) cout << c; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

그런 다음

./a.out <test.log> new.out

부인

따옴표 내에서 선 또는 여러 물건에 따옴표를 탈출 한 경우이 완전히 질식 것를 이동합니다. 내가 나오지도 생각하지 않는 문제를 제이미처럼

1

의 원인이됩니다 그 효과에 예를 "The word \"word\" is weird" 과 사물에 대한

은 작업에 좋습니다. 나의 sed 기술이 일을 위해 충분히 좋지 않을 수 있었다. 여기에 제이미의 본질적으로 같은 해결책이지만, 파이썬 :

#!/usr/bin/env python 

# Script to delete spaces within the double quotes, but not outside. 

QUOTE = '"' 
SPACE = ' ' 

file = open('data', 'r') 
for line in file: 
    line = line.rstrip('\r\n') 
    newline = '' 
    inside_quote = False 
    for char in list(line): 
     if char == QUOTE: 
      inside_quote = not inside_quote 
     if not (char == SPACE and inside_quote): 
      newline += char 
    print(newline) 
file.close() 

파일에 저장이 스크립트, rmspaces.py들은 말한다. 그런 다음 명령 줄에서 스크립트를 호출 할 수 있습니다 : 스크립트가 데이터를 데이터라는 파일에 있다고 가정하는 것이

python rmspaces.py 

참고. 스크립트를 맛있게 수정할 수 있습니다.

관련 문제