문제

내가와 같이 탈출 한 쉼표가있는 줄이 있다면 :

a,b,{c\,d\,e},f,g

Awk를 사용하여 다음 항목으로 구문 분석 할 수 있습니까?

a
b
{c\,d\,e}
f
g
도움이 되었습니까?

해결책

{
   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. 배열로 나뉩니다 a, 사용 ','구분자로서
  2. 배열을 빌드하십시오 b ~에서 a, 끝나는 라인 합병 '\'
  3. 인쇄 배열 b (참고 : 첫 번째 항목이 비어 있기 때문에 2시에 시작)

이 솔루션은 (지금) '라고 가정합니다.,''도망친 유일한 인물 '\'-그것은 어떤 것도 처리 할 필요가 없습니다. \\ 입력에서, 그리고와 같은 이상한 조합 \\\,\\,\\\\,,\,.

다른 팁

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

나는 Awk가 이와 같은 것에 대한 내장 지원이 있다고 생각하지 않습니다. 다음은 DigitalRoss만큼 짧지는 않지만 실수로 메이크업 문자열 (! Q!)에 닿을 위험이없는 솔루션이 있습니다. 그것은 AN과 함께 테스트하기 때문에 if, 당신은 또한 당신이 실제로 가지고 있는지에 대해주의를 기울여 확장 할 수 있습니다. \\, 끈의 끝에서 쉼표가 아닌 탈출 한 슬래시가되어야합니다.

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")
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top