免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2209 | 回复: 14

[文本处理] awk高手请进,看看怎么处理这个问题 [复制链接]

论坛徽章:
0
发表于 2016-12-05 12:04 |显示全部楼层
本帖最后由 chinaboywg 于 2016-12-05 14:44 编辑

有如下文本a.txt
1803201F20602321180425邓良才           6029696000246632             313100000013  易路通    10200101104401040000012         323584000888      
1803201F20602321180423哞哞              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180425邓鸿德           6013820100015049442          104100000004  易路通    10200101104401040000012         323584000888      
1803201F20602321180425乔丹              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180426威圣炫           6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888   

替换成:
1803201F20602321180425aaaaaa           6029696000246632             313100000013  易路通    10200101104401040000012         323584000888      
1803201F20602321180423aaaa              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180425aaaaaa           6013820100015049442          104100000004  易路通    10200101104401040000012         323584000888      
1803201F20602321180425aaaa              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180426aaaaaa           6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888




将第1列的 邓良才 哞哞等替换成aaaa.. ,替换后保持格式不变;汉字有可能是2个,3个,4个,5个,6个....;3个汉字就替换成6个英文,4个汉字就替换成8个英文,6个汉字就替换成12个 。。。依次类推;
求用awk 处理,谢谢;



论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-12-05 12:43 |显示全部楼层

4个汉字替换成哪8个英文?

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-12-05 14:01 |显示全部楼层
  1. #!/usr/bin/perl
  2. use warnings;
  3. use utf8;

  4. binmode (STDOUT, ':encoding(utf8)');
  5. my $tail = 'ceshi';

  6. while (<DATA>){
  7.     s/([^\d\s]+)/$tail/;
  8.     my $leng = length ($1) > 2 ? length ($1) * 2 : 0;
  9.     if ($leng){
  10.         $append = 'a' x ($leng - length ($tail));
  11.         s/(?<=\w)\b/$append/;
  12.     }
  13.     print;
  14. }
  15. __DATA__
  16. 602321180425邓良才           602969646632                313100000013  易路通    1020014010412         323584000888
  17. 602321180423哞哞                621626028016732          313584099990  易路通    1020044010012         323584000888
  18. 602321180425邓鸿德           601382015049442          104100000004  易路通    1020014010412         323584000888
  19. 602321180425乔丹                621626028016732          313584099990  易路通    1020044010012         323584000888
  20. 602321180426威圣炫           621626028016732          313584099990  易路通    1020014010412         323584000888
复制代码

论坛徽章:
0
发表于 2016-12-05 14:06 |显示全部楼层

不能改变原有的列对齐格式
另外,要用awk 啊

论坛徽章:
0
发表于 2016-12-05 14:13 |显示全部楼层
moperyblue 发表于 2016-12-05 12:43
4个汉字替换成哪8个英文?

随便 ceshices  

论坛徽章:
0
发表于 2016-12-05 14:27 |显示全部楼层
我先谈谈行怎么切割出第一列的问题。这里有个约束,我们对第一列后面的数据并不关心,不改变。
1如果是powershell,可以先把txt导入,转成csv,或excel保存。经过这一步的预处理,好处是以后,我们可以直接读写第一列。
2而如果是【脚本语言不支持csv,excel】或者【要求只能输出文本】,就麻烦了一点点。
需要找到【第一个空格】的位置,切割处理,然后还要加上尾部。

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
发表于 2016-12-05 17:16 |显示全部楼层
汉字前面字符串长度都一定的情况下
  1. awk -vstr="aaaaaaaaaaaa" '{t=length($1)-22;$1=substr($1,0,22)substr(str,0,2*t)}1' a.txt|column -t
复制代码

论坛徽章:
0
发表于 2016-12-05 17:29 |显示全部楼层
回复 7# elu_ligao

不行啊,原有的中间的空格不能丢掉啊要改成这样的:

1803201F20602321180425邓良才           6029696000246632             313100000013  易路通    10200101104401040000012         323584000888      
1803201F20602321180423哞哞              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180425邓鸿德           6013820100015049442          104100000004  易路通    10200101104401040000012         323584000888      
1803201F20602321180425乔丹              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180426威圣炫           6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   
1803201F20602321180425aaaaaa           6029696000246632             313100000013  易路通    10200101104401040000012         323584000888      
1803201F20602321180423aaaa              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180425aaaaaa           6013820100015049442          104100000004  易路通    10200101104401040000012         323584000888      
1803201F20602321180425aaaa              6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888      
1803201F20602321180426aaaaaa           6216260000028016732          313584099990  易路通    10200101104401040000012         323584000888


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-12-05 17:50 |显示全部楼层
回复 4# chinaboywg
并没有改变原始的文件格式, 只是 awk 不熟悉. 直接替换就行了.
  1. #!/usr/bin/perl
  2. use warnings;
  3. use utf8;

  4. binmode (STDOUT, ':encoding(utf8)');

  5. while (<DATA>){
  6.     s/([^\s\d]+)/'a' x length ($1) x 2/e;
  7.     print;
  8. }
  9. __DATA__
  10. 602321180425邓良才           602969646632                313100000013  易路通    1020014010412         323584000888
  11. 602321180423哞哞                621626028016732          313584099990  易路通    1020044010012         323584000888
  12. 602321180425邓鸿德           601382015049442          104100000004  易路通    1020014010412         323584000888
  13. 602321180425乔丹                621626028016732          313584099990  易路通    1020044010012         323584000888
  14. 602321180426威圣炫           621626028016732          313584099990  易路通    1020014010412         323584000888
复制代码

perl abc.pl
---------------------------------------------------------
602321180425aaaaaa           602969646632                313100000013  易路通    1020014010412         323584000888
602321180423aaaa                621626028016732          313584099990  易路通    1020044010012         323584000888
602321180425aaaaaa           601382015049442          104100000004  易路通    1020014010412         323584000888
602321180425aaaa                621626028016732          313584099990  易路通    1020044010012         323584000888
602321180426aaaaaa           621626028016732          313584099990  易路通    1020014010412         323584000888


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-12-05 17:51 |显示全部楼层
回复 4# chinaboywg
并没有改变原始的文件格式, 只是 awk 不熟悉. 直接替换就行了.
  1. #!/usr/bin/perl
  2. use warnings;
  3. use utf8;

  4. binmode (STDOUT, ':encoding(utf8)');

  5. while (<DATA>){
  6.     s/([^\s\d]+)/'a' x length ($1) x 2/e;
  7.     print;
  8. }
  9. __DATA__
  10. 602321180425邓良才           602969646632                313100000013  易路通    1020014010412         323584000888
  11. 602321180423哞哞                621626028016732          313584099990  易路通    1020044010012         323584000888
  12. 602321180425邓鸿德           601382015049442          104100000004  易路通    1020014010412         323584000888
  13. 602321180425乔丹                621626028016732          313584099990  易路通    1020044010012         323584000888
  14. 602321180426威圣炫           621626028016732          313584099990  易路通    1020014010412         323584000888
复制代码

perl abc.pl
---------------------------------------------------------
602321180425aaaaaa           602969646632                313100000013  易路通    1020014010412         323584000888
602321180423aaaa                621626028016732          313584099990  易路通    1020044010012         323584000888
602321180425aaaaaa           601382015049442          104100000004  易路通    1020014010412         323584000888
602321180425aaaa                621626028016732          313584099990  易路通    1020044010012         323584000888
602321180426aaaaaa           621626028016732          313584099990  易路通    1020014010412         323584000888


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP