免费注册 查看新帖 |

Chinaunix

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

[文本处理] [高难度]按规定长度前补或后补空格或零 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-11 21:22 |只看该作者 |倒序浏览
Config文件:
-----------
RECORD_1 12
RECORD_2 6
RECORD_3 14
RECORD_4 6
RECORD_5 6
RECORD_6 9

待处理文件:
-----------
123|cat|doggggg|fuck||7345


Output1:
123      cat   doggggg       fuck        7345     (结束END)


Output2:
000000000123000cat0000000doggggg00fuck000000000007345

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
2 [报告]
发表于 2014-08-11 21:35 |只看该作者
本帖最后由 欧阳西风 于 2014-08-11 21:50 编辑

回复 1# chendeshen


    output1没看出有什么规律啊?

    config的第一列标识的是什么?

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
3 [报告]
发表于 2014-08-11 22:00 |只看该作者
本帖最后由 klainogn 于 2014-08-11 22:34 编辑
  1. $ cat t
  2. 123|cat|doggggg|fuck||7345
  3. $ cat test.awk
  4. BEGIN{
  5.     FS="[ |]"
  6. }
  7. NR==FNR{
  8.     fmt[substr($1,8)]=$2
  9.     next
  10. }
  11. {
  12.     for(i=0;i++<NF;){
  13.         output1=output1 sprintf("%-"fmt[i]"s",$i)
  14.         output2=output2 sprintf("%"fmt[i]"s",$i)
  15.     }
  16.     print "output1==>"output1"END"
  17.     print "output2==>"gensub(" ", "0", "g", output2)
  18. }
  19. $ awk -f test.awk test t
  20. output1==>123         cat   doggggg       fuck        7345     END
  21. output2==>000000000123000cat0000000doggggg00fuck000000000007345
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-08-11 22:17 |只看该作者
回复 2# 欧阳西风


    config的第一列标识  :  RECORD的名称,主要是第二列起作用
   

Output1:
123      cat   doggggg       fuck        7345     (结束END)



主要是按config文件的第二列,不够的后补空格:

123(九个空格)cat(三个空格)doggggg(七个空格)fuck(两个空格再加六个空格)7345(五个空格)

论坛徽章:
0
5 [报告]
发表于 2014-08-11 22:20 |只看该作者
回复 3# klainogn


    这个实在高明~!Output2完全正确~

求教 Output1:

Output1:
123      cat   doggggg       fuck        7345     (结束END)



主要是按config文件的第二列,不够的后补空格:

123(九个空格)cat(三个空格)doggggg(七个空格)fuck(两个空格再加六个空格)7345(五个空格)

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
6 [报告]
发表于 2014-08-11 22:23 |只看该作者
  1. BEGIN{
  2.     FS="[ |]"
  3.     OFS=""
  4. }
  5. NR==FNR{
  6.     fmt[substr($1,8)]=$2
  7.     next
  8. }
  9. {
  10.     for(i=0;i++<NF;){
  11.         $i=sprintf("%-"fmt[i]"s",$i)
  12.     }   
  13.     $0=$0"END"
  14. }
  15. 1
复制代码
回复 5# chendeshen


   

论坛徽章:
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
7 [报告]
发表于 2014-08-12 00:17 |只看该作者
  1. $ awk -F'[ |]' -vOFS= 'NR==FNR{a[NR]=$2;next}{for(i=0;i++<NF;)$i=sprintf("%-"a[i]"s",$i)}1' a b
  2. 123         cat   doggggg       fuck        7345
复制代码
  1. $ awk -F'[ |]' -vOFS= 'NR==FNR{a[NR]=$2;next}{for(i=0;i++<NF;)$i=sprintf("%"a[i]"s",$i);gsub(" ",0)}1' a b
  2. 000000000123000cat0000000doggggg00fuck000000000007345
复制代码

论坛徽章:
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-12 08:03 |只看该作者
这不就是 printf 的事么?

论坛徽章:
0
9 [报告]
发表于 2014-08-12 09:58 |只看该作者
回复 7# yestreenstars


    Thx so much~ 很简洁。不过运行出错:"-bash: syntax error near unexpected token `i=0'

另外     a    b    分别是....?

论坛徽章:
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
10 [报告]
发表于 2014-08-12 10:14 |只看该作者
回复 9# chendeshen

a是config文件,b是待处理文件。

你直接复制我的命令还会报错吗?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP