免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2979 | 回复: 12
打印 上一主题 下一主题

[文本处理] 怎么在双重分隔符的文件里,对字符串进行处理 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-19 14:07 |只看该作者 |倒序浏览
我现在有个文件aa,它是以"|"做分隔的
xx|xx|xxxxx|xxx|aa_1231231_D|xx|xx
xx|xx|xxxxx|xxx|bbc_51231_D|xx|xx
xx|xx|xxxxx|xxx|ddd_31231_D|xx|xx
然后分隔出来的第5个字段内容又是以"_"为分隔符的内容,现在我就是对固定的第5个字段的数据进行处理
我只要以"_"为分隔符的第二个字符串,前面和后面的都剔除掉,比如aa转变之后就变成:
xx|xx|xxxxx|xxx|1231231|xx|xx
xx|xx|xxxxx|xxx|51231|xx|xx
xx|xx|xxxxx|xxx|31231|xx|xx
各位技术达人,该怎么弄

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-08-19 14:19 |只看该作者
目测一下:
  1. awk 'BEGIN{FS=OFS="|"}split($5,a,"_")>1{$5=a[2]}1'
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-08-19 14:25 |只看该作者
如果其它的字段没有 "_" 你直接把 |XX_ 替换成 | 就行了. 再把 _XX| 替换成 | 就OK了.

sed -e 's/|[a-z]\+_\|_[a-z]\+|/|/gi' <your file>

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
4 [报告]
发表于 2014-08-19 14:58 |只看该作者
yestreenstars 发表于 2014-08-19 14:19
目测一下:

ok.达到效果,能不能稍微解释一下这个命令,谢谢了

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
5 [报告]
发表于 2014-08-19 14:58 |只看该作者
回复 3# q1208c
对.理论上可以这么做


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-08-19 15:52 |只看该作者
回复 4# shmtu2005

BEGIN{FS=OFS="|"}
将输入和输出分隔符都设为竖杆

split($5,a,"_")>1{$5=a[2]}
以下划线分割第5个字段,并将结果存入数组a,最后判断分割得到的数组长度是否大于1(大于1表示是以下划线分割的),如果是,就将a[2]赋值给第5个字段

1
打印
   

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
7 [报告]
发表于 2014-08-19 16:38 |只看该作者
q1208c 发表于 2014-08-19 14:25
如果其它的字段没有 "_" 你直接把 |XX_ 替换成 | 就行了. 再把 _XX| 替换成 | 就OK了.

sed -e 's/|[a-z] ...

试了下,不行

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-08-19 16:42 |只看该作者
回复 7# shmtu2005

啊? 我在机器上可以的. 你是在什么OS上? 不会是 AIX 或 Solaris 吧?
   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
9 [报告]
发表于 2014-08-19 16:45 |只看该作者
本帖最后由 bulletmarquis 于 2014-08-19 16:59 编辑

我喜欢笨办法


cat a
xx|xx|xxxxx|xxx|aa_1231231_D|xx|xx
xx|xx|xxxxx|xxx|bbc_51231_D|xx|xx
xx|xx|xxxxx|xxx|ddd_31231_D|xx|xx

cat a|awk -F'\\||_' '{print $1"|"$2"|"$3"|"$4"|"$6"|"$8"|"$9}'
xx|xx|xxxxx|xxx|1231231|xx|xx
xx|xx|xxxxx|xxx|51231|xx|xx
xx|xx|xxxxx|xxx|31231|xx|xx

cat a|sed 's/\(.*\)[^|]*_\(.*\)_[^|]*\(.*\)/\1\2\3/'
xx|xx|xxxxx|xxx|aa1231231|xx|xx
xx|xx|xxxxx|xxx|bbc51231|xx|xx
xx|xx|xxxxx|xxx|ddd31231|xx|xx


当然,建议还是用awk+split来处理更精炼

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
10 [报告]
发表于 2014-08-19 16:57 |只看该作者

  1. awk -F"|" -vOFS="|"  '{split($5,array,"_");$5=array[2]}1'  ufile
  2. xx|xx|xxxxx|xxx|1231231|xx|xx
  3. xx|xx|xxxxx|xxx|51231|xx|xx
  4. xx|xx|xxxxx|xxx|31231|xx|xx
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP