2013-02-13 4 views
0

외곽이 필드에 쉼표로 파일을 수정합니다 : 그것은 주석 필드에 외곽이 쉼표의 변수 수를 포함하기 때문에사용 AWK는 CSV 내가처럼 보이는 CSV 파일이

height, comment, name 
    152, he was late, for example, on Tuesday, Fred 
    162, , Sam 

내가이 파일을 구문 분석 할 수 있습니다 (하지만 다른 필드 없음). 때문에 내 문제가 해결되지 않습니다

height, comment, name 
    152, he was late; for example; on Tuesday, Fred 
    162, , Sam 

(따옴표로 전체 필드를 묶는 : 나는 두 번째 필드에 쉼표가 세미콜론이 될 수 있도록 (나에게 매우 새로운) awk을 사용하여 파일을 수정하고 싶습니다 내 CSV 파서는 따옴표를 이해하지 못합니다.) 지금까지 NF를 사용하여 비공개 쉼표의 수를 계산 한 다음 gsub를 사용하여 불쾌한 정규식으로 바꾼 것을 보았습니다.하지만 awk를 활용할 수 있어야한다고 생각합니다. 더 읽기 쉬운 프로그램을 작성하고 NF가 이런 식으로 행동하는지 확신 할 수 없습니다.

+0

는 ** 정말 ** 프레드 후 쉼표 있습니까? 그게 얼마나 못생긴가, 실제로 얼마나 많은 분야가 있나? 파일에 임의의 쉼표 * 이외의 *가 포함 된 파일이라면 먼저 문제를 해결해야합니다. – DigitalRoss

+0

여분의 쉼표가 매번 필드 2에 있는지, NF == 6인지, 추가 쉼표 3 개가 있는지, 일시적으로 처음과 마지막을 다른 것으로 변경 한 다음 나머지 쉼표를 세미콜론 (한 번에 한 줄씩). 물론 이것은 실제로 유연한 장기적인 솔루션이 아닙니다. 데이터에 절대 존재하지 않는 FS 값으로 데이터를 내보내는 것이 어떻습니까? 행운을 빕니다. – shellter

+0

@DigitalRoss Fred 후에는 쉼표가 없습니다. 그것은 오타였습니다. 지적 해 주셔서 감사합니다. – orizon

답변

2

본질적으로 단지 무차별 대항력이지만 이해하기 쉽습니다.

으로 호출
$ awk -F "," -f test.awk test.dat 

awk 파일.

$ cat test.awk 
{ 
    printf "%s, ", $1 

    if (NF > 3) { 
     for (i = 2; i < NF; i++) { 
      printf "%s;", $i 
     } 
     printf ", " 
    } 
    else { 
     printf "%s, ", $2 
    } 

    printf "%s\n", $NF 
} 
+0

이 솔루션의 가장 큰 문제점은 모든 쉼표 뒤에 하나 이상의 빈 문자가 있다는 것입니다. 물론 쉼표가 없거나 많을 수도 있고 탭이있을 수도 있습니다. –

+0

고마워요. 네 개 이상의 열을 수정하는 것이 더 쉽기 때문에 대답을 선택했습니다. 나는 이것이 답을 구별하기에 특히 좋은 근거는 아니라는 것을 알고 있습니다. 그러나 나는 어떤 좋은 이유라도 그들을 구분할 수 없었습니다. 필자는 @Ed가 설명하는 문제에 대해 테스트했다. 예를 들어''152 ''라고 입력하면, 그는 화요일에, 예를 들어, Fred''와 같이 늦었고, 저에게는 효과가 있었지만 아마 오해했을 것입니다. 어쨌든 내 파일에는 각 쉼표 뒤에 공백이 있습니다. – orizon

+0

@ EdMorton : 아니요.이 솔루션은 아무 것도 사용하지 않습니다. 탭, 공백 문자, 공백 문자의 영향을받지 않습니다. –

2
$ cat file 
    height, comment, name 
    152, he was late, for example, on Tuesday, Fred 
    162, , Sam 

$ awk -v OFS=, '{ 
    height = comment = name = $0 
    sub(/,.*$/,"",height) 
    sub(/^.*,/,"",name) 
    gsub(/^[^,]+,|,[^,]+$/,"",comment) 
    gsub(/,/,";",comment) 

    print height, comment, name 
}' file 
    height, comment, name 
    152, he was late; for example; on Tuesday, Fred 
    162, , Sam 
+0

+1 및 감사합니다. 나는 두 가지 대답을 모두 받아 들일 수 있었으면 좋겠다. – orizon

관련 문제