2009-09-23 420 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. 分割成阵列a,使用 ',' 作为分隔符
  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!',这将会起作用。 – 2009-09-23 20:30:02

1

我不认为AWK有什么内置支持这样的事情。这里的解决方案并不像DigitalRoss的那么简短,但应该不会有意外击中你制作的字符串(!Q!)的危险。由于它使用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") 
} 
+0

我认为这是你感兴趣的所有分裂,因此将FS设置为逗号分割。如果你只是在一个子字符串上执行此操作,请使用系统PAUSE的相同方法的版本。 – Cascabel 2009-09-23 20:36:29