2009-09-23 2 views

답변

2
{ 
    split($0, a, /,/) 
    j=1 
    for(i=1; i<=length(a); ++i) { 
     if(match(b[j], /\\$/)) { 
     b[j]=b[j] "," a[i] 
     } else { 
     b[++j] = a[i] 
     } 
    } 
    for(k=2; k<=length(b); ++k) { 
     print b[k] 
    } 
} 
  1. 분할, 사용 구분 기호로 ',을'
  2. 빌드 배열 ba에서, '\'
  3. 인쇄 배열 b (참고로 끝나는 선 병합 : 시작을 첫 번째 항목이 비어 있기 때문에 2시에)

이 솔루션은 '\'으로 이스케이프 한 문자는 ','이라고 가정합니다. 즉, 입력에 \\이나 \\\,\\,\\\\,,\,과 같은 이상한 조합을 처리 할 필요가 없습니다.

2
{ 
    gsub("\\\\,", "!Q!") 
    n = split($0, a, ",") 
    for (i = 1; i <= n; ++i) { 
    gsub("!Q!", "\\,", a[i]) 
    print a[i] 
    } 
} 
+0

** 텍스트에'! Q!'가없는 한 작동합니다. –

1

은 내장 지원과 같은 뭔가를 가지고있다. DigitalRoss만큼 짧지는 않지만 실수로 생성 된 문자열 (! Q!)을 타격 할 위험이 없어야합니다. if으로 테스트 했으므로 문자열 끝에 실제로 \\,이 있는지 조심하여 확장 할 수 있습니다. 쉼표가 아닌 이스케이프 처리 된 슬래시 여야합니다. 배열 a

BEGIN { 
    FS = "," 
} 

{ 
    curfield=1 
    for (i=1; i<=NF; i++) { 
     if (substr($i,length($i)) == "\\") { 
      fields[curfield] = fields[curfield] substr($i,1,length($i)-1) FS 
     } else { 
      fields[curfield] = fields[curfield] $i 
      curfield++ 
     } 
    } 
    nf = curfield - 1 
    for (i=1; i<=nf; i++) { 
     printf("%d: %s ",i,fields[i]) 
    } 
    printf("\n") 
} 
+0

나는 이것이 당신이하고 싶은 모든 분열이라고 생각 했으므로 FS를 쉼표로 분리하도록 설정했다. 부분 문자열에서만이 작업을 수행하려는 경우 동일한 방법의 시스템 PAUSE 버전을 사용하십시오. – Cascabel