免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 红狐狸
打印 上一主题 下一主题

求助:文件处理:分割符 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-06-14 13:38 |只看该作者
引号内的,先替换成别的
  1. [root@Mylinux tmp]# cat file
  2. abc,"bbb,1","",77,"122","j,k,l",e,344,"x,y,z"
  3. [root@Mylinux tmp]# awk -F '"' -v OFS='"' '{for (i=2;i<=NF;i+=2) gsub(/,/,"#",$i)}1' file
  4. abc,"bbb#1","",77,"122","j#k#l",e,344,"x#y#z"
复制代码

论坛徽章:
0
12 [报告]
发表于 2011-06-14 14:07 |只看该作者
这个问题还是用脚本处理好点

  1. #!/bin/awk

  2. BEGIN {
  3. FS=","
  4. }

  5. {
  6.     c=0;
  7.     m=0;
  8.     h=0;
  9.     for(i=1;i<=NF;i++)
  10.     {
  11.         #输出字段计数
  12.         if(h==5)
  13.             continue;

  14.         #查看左引号
  15.         if($i ~ /^\".*/)
  16.             c++;

  17.         #查看右引号
  18.         if($i ~ /.*\"$/)
  19.                 c++;

  20.         #两个引号在同一字段
  21.         if($i ~ /.*\"$/ && $i ~ /^\".*/)
  22.                 c=0;

  23.         #没有引号字段处理
  24.         if(c==0)
  25.         {
  26.             h++;
  27.             if(i==1)
  28.                 printf ($i);
  29.             else if(i>1)
  30.                 printf (",%s", $i);
  31.         }
  32.         #有引号且为后续字段
  33.         else if(c==1 && m==1)
  34.         {
  35.             printf (",%s", $i);
  36.         }
  37.         #有引号且为第一个字段
  38.         else if(c==1)
  39.         {
  40.             if(i>1)
  41.                 printf (",%s", $i);
  42.             else
  43.                 printf ($i);
  44.             m=1;
  45.         }
  46.         #有引号且为最后一个字段
  47.         else if(c==2)
  48.         {
  49.             printf (",%s", $i);
  50.             c=0;
  51.             m=0;
  52.             h++;
  53.         }

  54.     }
  55. }

复制代码

论坛徽章:
0
13 [报告]
发表于 2011-06-14 14:18 |只看该作者

  1. perl -ne 'chomp;s/^"/"\\"/;s/"$/\\""/;s/,"/,"\\"/g;s/",/\\"",/g;eval("\@a=(".$_.");");print join("|",@a),"\n";'

  2. 处理后,输出的是以 | 分隔的各字段
复制代码

论坛徽章:
0
14 [报告]
发表于 2011-06-14 16:43 |只看该作者
学习了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2011-06-14 17:01 |只看该作者
都是牛A与AC之间的人。。。

论坛徽章:
0
16 [报告]
发表于 2011-06-21 08:37 |只看该作者
感谢大家的回复,
我仔细看了下
ywlscpl和ywlscpl 的回复,因为倾向与使用AWK实现

都能很好的去掉引号中的逗号,我想稍微改造一下,(本来想自己做,怕搞错了,再次求教),

想处理类似这样的数据  ,"aaa"bb,,",  即引号中可能有引号逗号,分割符号,我想换成【“,】 或则【,“】
因为这两个字符同时出现在字段中的概率相对较小
谢谢

论坛徽章:
0
17 [报告]
发表于 2011-06-21 10:05 |只看该作者
回复 16# 红狐狸


没看明白

论坛徽章:
0
18 [报告]
发表于 2011-06-21 11:20 |只看该作者
回复  红狐狸


没看明白
ywlscpl 发表于 2011-06-21 10:05



   就是说 “ ” 中可能还还有“ 号  即可这样的字段: " aaa"bb"  
这是一个字段
如果只考虑用引号做分割可能存在问题,所以我考虑用{【",】(引号逗号两个字符)或则【,"】},做分割因为字段与字段间是一定有逗号的,字段中的引号后边跟逗号的概率较小。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
19 [报告]
发表于 2011-06-21 14:58 |只看该作者
回复 18# 红狐狸


    如果文本是:
  1. 123, "11"1", "aaa, bbb, 1", "", 77, "122",
复制代码
你想得到什么?
  1. 123, "11 1", "aaa bbb 1", "", 77, "122",
复制代码
么?

论坛徽章:
0
20 [报告]
发表于 2011-06-21 15:39 |只看该作者
是的,我想得到,如上所述
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP