Chinaunix

标题: 字段中包含双引号取不出来 [打印本页]

作者: oracle26    时间: 2017-05-22 13:29
标题: 字段中包含双引号取不出来
本帖最后由 oracle26 于 2017-05-22 13:54 编辑

文本格式:

aa,bb,"cc,dd,ee",ff,gg
11,22,"44,55",66,77
AA,BB,CC,DD,EE
FF,GG,HH,II,JJ
KK,LL,"MM",NN,OO

要的到的结果:

aa cc,dd,ee gg
11 44,55 77
AA CC EE
FF HH JJ
KK MM OO

求大神帮忙看看,如何把双引号中的当做一列啊

作者: oracle26    时间: 2017-05-22 13:34
去以逗号分的第一列和第三列和第五列,但第3列里面有些有逗号,所以去不完整,咋整?
作者: Shell_HAT    时间: 2017-05-22 14:42
如果你有 awk 4.x 可以用 FPAT 来实现
http://bbs.chinaunix.net/thread-4125586-1-1.html
作者: vagrant_1220    时间: 2017-05-22 14:42
awk -F ',' '{match($0,/".+"/,arr);if( RSTART==0) {arr[0]=$3;}else {gsub("\"","",arr[0])}; print $1,arr[0],$NF;}' ufile

作者: 本友会机友会摄友会    时间: 2017-05-22 15:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: jason680    时间: 2017-05-22 16:10
回复 1# oracle26

awk 3.0 solution

$ awk -f get_csv.awk FILE
aa cc,dd,ee gg
11 44,55 77
AA CC EE
FF HH JJ
KK MM OO


$ cat get_csv.awk
BEGIN{
  FS=","
}
function get_csv(c,n,q){
  #print "NF = ", NF
  c = 0
  for (n = 1; n <= NF; ++n) {
    if(q == 1){
      if(sub(/"$/,"",$n))   
        q = 0
      $c = $c FS $n
      continue
    }
    if(sub(/^"/,"",$n)){
      q = 1
      $(++c) = $n
      if(sub(/"$/,"",$n))
        q = 0;
      continue
    }
    $(++c) = $n
  }
  NF = c
}
{
  get_csv();
print $1,$3,$5
}


作者: oracle26    时间: 2017-05-22 16:31
回复 5# 本友会机友会摄友会

linux 下咋用的?
作者: oracle26    时间: 2017-05-22 16:33
回复 3# Shell_HAT

谢谢版主,可惜不是4版本
作者: oracle26    时间: 2017-05-22 16:34
回复 4# vagrant_1220

恩,用match最简洁,谢谢啦
作者: oracle26    时间: 2017-05-22 16:35
回复 6# jason680

貌似2楼的用match更简洁些,谢谢啦
作者: Shell_HAT    时间: 2017-05-22 17:54
回复 10# oracle26


4楼match方案无法正确处理这种数据:
aa,bb,"cc,dd,ee",ff,gg
11,22,"44,55",66,77
AA,BB,C"C,D"D,EE
FF,GG,HH,II,JJ
KK,LL,"MM",NN,OO
作者: haooooaaa    时间: 2017-05-22 18:08
  1. awk -F, '{a=$1;b=$3;c=$NF;FS="\"";$0=$0;print a,(NF>2?$2:b),c;FS=","}' a
  2. aa cc,dd,ee gg
  3. 11 44,55 77
  4. AA CC EE
  5. FF HH JJ
  6. KK MM OO
复制代码

作者: haooooaaa    时间: 2017-05-22 18:08
  1. awk -F, '{a=$1;b=$3;c=$NF;FS="\"";$0=$0;print a,(NF>2?$2:b),c;FS=","}' a
  2. aa cc,dd,ee gg
  3. 11 44,55 77
  4. AA CC EE
  5. FF HH JJ
  6. KK MM OO
复制代码

作者: haooooaaa    时间: 2017-05-22 18:11
  1. sed -r 's/,([^,]+),/ /;s/,[^,]+,([^,]+$)/ \1/' a
  2. aa "cc,dd,ee" gg
  3. 11 "44,55" 77
  4. AA CC EE
  5. FF HH JJ
  6. KK "MM" OO
复制代码

作者: 本友会机友会摄友会    时间: 2017-05-22 18:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: cclxpp123    时间: 2017-05-23 01:37
本帖最后由 cclxpp123 于 2017-05-23 02:06 编辑

awk -F \" '{n=split($0,a,",");print($2?a[1]" "$2" "a[n]:a[1]" "a[3]" "a[n])}' x
作者: sditmaner    时间: 2017-05-23 11:18
回复 4# vagrant_1220
作者: vagrant_1220    时间: 2017-05-25 11:00
针对 AA,BB,C"C,D"D,EE 兼容


awk -F ',' '{match($0,/".+"/,arr);l=r="";if( RSTART==0) {arr[0]=$3;}else {if(match($3,/"/)>0) {sub(/".*/,"",$3);l=$3};if(match($(NF-1),/"/)>0) {sub(/.[^"]*"/,"",$(NF-1));r=$(NF-1)};gsub("\"","",arr[0])}; print $1,l""arr[0]""r,$NF;}'

作者: chengchow    时间: 2017-05-25 17:28
  1. [root@zbxagent01 temp]# cat a
  2. aa,bb,"cc,dd,ee",ff,gg
  3. 11,22,"44,55",66,77
  4. AA,BB,CC,DD,EE
  5. FF,GG,HH,II,JJ
  6. KK,LL,"MM",NN,OO
  7. [root@zbxagent01 temp]# sed -r 's/^([^,]+,)[^,]+,(.*,)[^,]+,([^,]+)$/\1\2\3/g' a
  8. aa,"cc,dd,ee",gg
  9. 11,"44,55",77
  10. AA,CC,EE
  11. FF,HH,JJ
  12. KK,"MM",OO
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2