免费注册 查看新帖 |

Chinaunix

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

awk对文本选择性地操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-21 12:24 |只看该作者 |倒序浏览
对如下的文本进行操作,凡是以SPNT开头的不管,保持原样,在有如“VELF    2006024  -20  ”这样的行中,取-20,加到其后的63,183,279,396,492,604,743---,中,直到“VELF    2006064  -21   ”这行,开始取-21,加到后面的列中。文本见附件1,2
SPNT    2006024      1024.0  21545740   4971705       402
VELF    2006024  -20   63 1549   183 1630  279 1714  396 1834   492 1919
VELF                     604 2031  743 2154  854 2259 1001 2350 1088 2412
VELF                     1145 2459 1235 2526 1353 2631 1436 2712 1533 2817
VELF                         1726 2989 1787 3055 1874 3166 1967 3249 2050 3325
VELF                         2221 3459 2304 3529 2417 3639 2488 3710 2642 3834
VELF                         2750 3914 2913 4020 3046 4109 3246 4240 3522 4410
VELF                         3844 4585 3969 4655 4130 4750 4330 4865 4509 4960
VELF                          4705 5045 5013 5160 5996 5490
SPNT    2006064     1064.0  21546433   4971305       402
VELF    2006064  -21   31 1519  138 1578  233 1655  296 1714  393 1813
VELF                           446 1854  549 1949  619 1998  678 2063  782 2149
VELF                           883 2254  955 2292 1041 2364 1127 2397 1256 2498
VELF                         1324 2569 1393 2641 1507 2760 1579 2832 1719 2961
VELF                         1777 3023 1831 3066 1927 3161 2010 3246 2118 3381
VELF                         2258 3519 2351 3610 2412 3658 2623 3831 2789 3951
VELF                         2889 4012 3000 4084 3138 4165 3308 4269 3472 4374
VELF                         3618 4469 3754 4550 3973 4685 4170 4795 4411 4920
VELF                         4616 5010 5009 5170 5987 5490
SPNT    2006104    1104.0  21547126   4970905       402
VELF    2006104  -22   36 1533  169 1619  262 1677  321 1709  394 1831
VELF                          475 1926  514 1958  617 2008  664 2035  790 2179
VELF                          851 2235  933 2283 1066 2383 1167 2426 1281 2512

调整大小 sxx.jpg (39.57 KB, 下载次数: 32)

如图操作...

如图操作...

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2006-04-22 05:41 |只看该作者

回复 1楼 No.92 的帖子

再描述得清楚写些,有些看不明白。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 2006-04-23 06:58 |只看该作者

回复 1楼 No.92 的帖子

我搭了个框架,分3步,第一步照抄,第二步取加数、加操作,第三步只是加操作,似乎可行。
问的是否是这样的意思?

awk '{
        if(af == 0)
        {       if($1 == "SPNT")
                {       printf("111---%s\n",$0)
                }
                af = 1
        }
        else if(af == 1)
        {       if($1 == "VELF")
                        printf("222---%s===%s\n",$0,$3)
                else    printf("格式有问题\n")
                af = 2
        }
        else if(af == 2)
        {
                if($1 == "SPNT")
                {       printf("111---%s\n",$0)
                        af = 1
                }
                else    printf("333---%s\n",$0)
        }
}' sam

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2006-04-23 07:29 |只看该作者

回复 1楼 No.92 的帖子

续:
现在已把问题分解为:
第二步中只须把加数加到第 4 列起得双数列上
第三步中把加数加到第 2 列起得双数列上

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2006-04-25 21:46 |只看该作者

回复 1楼 No.92 的帖子

把else if(af ==1)的花括弧部分用以下的代码替换,即第二步中只须把加数加到第 4 列起的双数列上

      {       if($1 == "VELF")
                {       printf("222---%s\n",$0)
                        bl = substr($3,2)
                        printf("%s      %s          0 ", $1, $2)
                        for(i = 4; i <= NF; i += 2)
                        {       rel = $i + bl
                                printf("%4d %s ", rel, $(i+1))
                        }
                        printf("\n")
                }
                else    printf("格式有问题1\n")
                af = 2
        }

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
6 [报告]
发表于 2006-04-29 05:00 |只看该作者

回复 5楼 zongyaotang 的帖子

把else if(af ==2)的花括弧部分用以下的代码替换,即第三步中只须把加数加到第 4 列起的双数列上,应该是提问者想要的结果了。这里包括一些调试信息。

{
                if($1 == "SPNT")
                {       printf("111---%s\n",$0)
                        af = 1
                }
                else if($1 == "VELF")
                {       printf("333---%s\n",$0)
                        printf("%s                       ", $1)
                        for(i = 2; i <= NF; i += 2)
                        {       rel = $i + bl
                                printf("%4d %s ", rel, $(i+1))
                        }
                        printf("\n")
                }
        }

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2006-04-29 11:36 |只看该作者
试试这段perl:
  1. perl -pe 'if (! /^SPNT/) {
  2.   $delta=$1 if /([+-]\d+)/;
  3.   if (s/(VELF\s+2006\d+\s+[+-]\d+)//) {print $1};
  4.   s/(\d+)/$1+$delta/ge}'
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-04-30 08:52 |只看该作者
没看清楚楼主的要求,原来是要隔一列加上变化量。修正一下:
  1. perl -pe 'if (! /^SPNT/) {
  2.   $delta=$1 if /([+-]\d+)/;
  3.   if (s/(VELF\s+2006\d+\s+[+-]\d+)//) {print $1};
  4.   s/(\d+)(\s+\d+)/($1+$delta).$2/ge}'
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2006-04-30 15:35 |只看该作者

回复 8楼 woodie 的帖子

lz 不见了!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-04-30 17:31 |只看该作者
原帖由 zongyaotang 于 2006-4-30 15:35 发表
lz 不见了!

"皇帝不急太监急“。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP