免费注册 查看新帖 |

Chinaunix

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

[系统管理] linux awk 实现同一固定字段 每出现3次 替换成不同值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-18 10:05 |只看该作者 |倒序浏览
本帖最后由 人才视野 于 2015-11-18 16:14 编辑

datafile
1231 xxxyyyy 3232
1231 xxxyyyy 3232
1231 xxxyyyy 3232

1231 xxxyyyy 3232
1231 xxxyyyy 3232
1231 xxxyyyy 3232

1231 xxxyyyy 3232
1231 xxxyyyy 3232
1231 xxxyyyy 3232

target
AAA
BBB
CCC

把datafile 里面的xxxyyy 替换成target里面的值
xxxyyy 每3次 对应 一个target里面的值, 目标结果

1231 AAA 3232
1231 AAA 3232
1231 AAA 3232

1231 BBB 3232
1231 BBB 3232
1231 BBB 3232

1231 CCC 3232
1231 CCC 3232
1231 CCC 3232

我用下面的语句出来的结果不对,一直只有一行输出, 求高手帮忙看下那里有问题。或者有什么其他的办法实现,多谢多谢
sed '/^$/d' data1 | awk
’BEGIN{FS="\n";j=1;n=3
countrylist[1]="AAA"
countrylist[2]="BBB"
countrylist[3]="CCC"
}
{
for (Cname in countrylist)
{ count=0
  for (i=j;i<=NF;i++)
    {
      if ( $i == "xxxyyy" )
          { $i = countrylist[Cname]
                count += count
                      if ( count == n )
                             {
                              j=i
                              break   
                     }
                    
                  }
    }
}
}
END{print $0}’

-update-------------------------------------------------------------------------------------------------

首先谢谢各位的回复,
但是我用大家的使用了一下,还是不行,可能是我给的数据例子不太准确,使大家理解错了。
我在更新一下datafile的数据, 如下

1232 xxxyyyy 23423 xxxyyyy xxxyyyy
1232 6546  
1232 6161 xxxyyyy 3432xxxyyyy
1232 xxxyyyy dfas xxxyyyy
1232 xxxyyyy dfas xxxyyyy xxxyyyy

要替换的关键字 xxxyyyy 不固定列, 每列的出现次数也不固定。

唯一要确定的是,依次从头开始,每3次 都被target里面的相应的值替换
期望结果如下:

1232 AAA 23423 AAA AAA
1232 6546
1232 6161 BBB 3432 BBB
1232 BBB dfas CCC
1232 CCC dfas CCC xxxyyyy

谢谢大家

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [报告]
发表于 2015-11-18 10:08 |只看该作者
whats?...........

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
3 [报告]
发表于 2015-11-18 10:27 |只看该作者
  1. awk 'NR==FNR{a[NR]=$0;next}NF{sub("xxxyyyy",a[int(c++/3)+1])}1' b a
  2. 1231 AAA 3232
  3. 1231 AAA 3232
  4. 1231 AAA 3232

  5. 1231 BBB 3232
  6. 1231 BBB 3232
  7. 1231 BBB 3232

  8. 1231 CCC 3232
  9. 1231 CCC 3232
  10. 1231 CCC 3232
复制代码

论坛徽章:
5
金牛座
日期:2015-07-03 13:32:00卯兔
日期:2015-07-03 13:32:17程序设计版块每日发帖之星
日期:2015-11-29 06:20:0015-16赛季CBA联赛之同曦
日期:2015-12-15 09:36:06CU十四周年纪念徽章
日期:2016-07-06 17:18:48
4 [报告]
发表于 2015-11-18 11:30 |只看该作者
回复 3# haooooaaa


   请问大神,awk能够有办法看到全部执行过程吗?类似于shell的sh -x?

论坛徽章:
0
5 [报告]
发表于 2015-11-18 11:35 |只看该作者
回复 3# haooooaaa


    hello haooooaaa,


      请问,a和b是代表 两个文件吗? c是什么意思呢。
      麻烦解释下大致意思,是个什么思路,

  非常感谢。

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
6 [报告]
发表于 2015-11-18 11:37 |只看该作者
回复 4# seanking1987


    man awk 看看,应该有的。


   不过我一般是 print , 多写几个 print ,就知道怎么回事了。

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
7 [报告]
发表于 2015-11-18 11:39 |只看该作者
回复 5# 人才视野


    awk 'NR==FNR{a[NR]=$0;next}NF{sub("xxxyyyy",a[int(c++/3)+1])}1' filetarget filedatefile



语句里面的c 是变量


把需要替换的放入数组,

然后  int(c++/3)+1 对应每个数组元素

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
8 [报告]
发表于 2015-11-18 11:51 |只看该作者
  1. #!/usr/bin/awk -f

  2. BEGIN {
  3.     steps=3
  4.     replaceIndex=0
  5. }

  6. NR==FNR {
  7.     replaceArry[i++]=$0
  8.     next
  9. }
  10. /^$/ {
  11.     # skip empty linei
  12.     print $0
  13.     next
  14. }
  15. {
  16.     i = int(noEmptyLine / steps)
  17.     i = i % steps
  18.     $2 = replaceArry[i]
  19.     print $0
  20.     noEmptyLine++   
  21. }
复制代码

论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
9 [报告]
发表于 2015-11-18 12:18 |只看该作者
本帖最后由 sync_1521 于 2015-11-18 12:19 编辑

凑下热闹
  1. awk 'NR==FNR{for(;i<=NR*3;i++)a[i]=$0;next}$0{$2=a[++j]}1' target datafile
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2015-11-18 15:02 |只看该作者
回复 1# 人才视野

1. change key-word "xxxyyyy"
$ awk -vc=1 'FNR==NR{a[NR]=$0;next}/^ *$/{c++}{sub(/xxxyyyy/,a[c])}1' target datafile

2. change item 2($2)
$ awk -vc=1 'FNR==NR{a[NR]=$0;next}/^ *$/{c++}{$2=a[c]}1' target datafile

1231 AAA 3232
1231 AAA 3232
1231 AAA 3232

1231 BBB 3232
1231 BBB 3232
1231 BBB 3232

1231 CCC 3232
1231 CCC 3232
1231 CCC 3232

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP