Frage

Wenn ich eine Schnur mit entkommenen Kommas wie SO hätte:

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

Wie könnte ich awk verwenden, um das in die folgenden Elemente zu analysieren?

a
b
{c\,d\,e}
f
g
War es hilfreich?

Lösung

{
   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. In Array aufgeteilt a, mit 'mit' ','als Trennzeichen
  2. Array bauen b aus a, Zusammenführen von Linien, die in 'enden'\'
  3. Druckarray b (Hinweis: Startet bei 2, da der erste Artikel leer ist)

Diese Lösung setzt (vorerst) voraus, dass ',"ist der einzige Charakter, der jemals entkommen ist"\'-Das ist, es besteht keine Notwendigkeit, mit irgendjemandem umzugehen \\ in der Eingabe, noch seltsame Kombinationen wie wie \\\,\\,\\\\,,\,.

Andere Tipps

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

Ich glaube nicht, dass Awk eine integrierte Unterstützung für so etwas hat. Hier ist eine Lösung, die nicht annähernd so kurz ist wie die von Digitalross, aber keine Gefahr hat, jemals versehentlich Ihre erfundene Zeichenfolge zu treffen (! Q!). Da testet es mit einem if, Sie könnten es auch erweitern, um vorsichtig zu sein, ob Sie tatsächlich haben \\, Am Ende Ihrer Schnur sollte ein entkommener Schrägstrich sein, nicht ein Komma.

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")
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top