免费注册 查看新帖 |

Chinaunix

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

【已解决】awk合并两个文件的问题,真心求帮助!真心求帮助!真心求帮助!谁来帮帮我 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-28 10:08 |只看该作者 |倒序浏览
本帖最后由 有点浪有点漫 于 2012-06-29 08:56 编辑

文件1:TEST1
0001|01|0
0001|02|0
0001|03|0
0001|04|0
0001|05|0

文件2:TEST2
0001|ChinaUnix论坛真是不错

结果:
文件3:TEST3
0001,ChinaUnix论坛真是不错,01,0
0001,ChinaUnix论坛真是不错,02,0
0001,ChinaUnix论坛真是不错,03,0
0001,ChinaUnix论坛真是不错,04,0
0001,ChinaUnix论坛真是不错,05,0

由文件1与文件2生成文件3的方法如下:
  1. awk -F \| 'NR==FNR{a[$1]=$2} \
  2. NR>FNR{printf("%s,%s,%s\,%sn",$1,a[$1],$2,$3);}' \
  3. TEST2  TEST1  >!  TEST3
复制代码
文件4:TEST4
0001,ChinaUnix论坛真是不错,01,0,02,0,03,0,04,0,05,0

由文件1与文件2生成文件4的方法该如何写呢?求教....(作为一名初学者,请多多指教,谢谢


论坛徽章:
0
2 [报告]
发表于 2012-06-28 10:49 |只看该作者
本帖最后由 personball 于 2012-06-28 10:50 编辑
  1. personball@vostro:awk$awk -F, '{if(!a[$1","$2]){a[$1","$2]=$0}else{a[$1","$2]=a[$1","$2]","$3","$4}}END{for(i in a)print a[i] }' TEST3
  2. 0001,ChinaUnix论坛真是不错,01,0,02,0,03,0,04,0,05,0
  3. personball@vostro:awk$cat TEST3
  4. 0001,ChinaUnix论坛真是不错,01,0
  5. 0001,ChinaUnix论坛真是不错,02,0
  6. 0001,ChinaUnix论坛真是不错,03,0
  7. 0001,ChinaUnix论坛真是不错,04,0
  8. 0001,ChinaUnix论坛真是不错,05,0
  9. personball@vostro:awk$
复制代码
回复 1# 有点浪有点漫
  1. personball@vostro:awk$awk -F, '{t=$1","$2; if(!a[t]){a[t]=$0}else{a[t]=a[t]","$3","$4}}END{for(i in a)print a[i] }' TEST3
  2. 0001,ChinaUnix论坛真是不错,01,0,02,0,03,0,04,0,05,0
  3. personball@vostro:awk$
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2012-06-28 10:50 |只看该作者
TEST3 中要会用OFS.
  1. awk -F \| 'NR==FNR{a[$1]=$2} NR>FNR{$1=$1 OFS a[$1]}1' OFS=, test2 test1 > test3
复制代码
TEST4的代码
  1. awk -F \| 'NR==FNR{a[$1]=$2;next}
  2.           {b[$1]=b[$1]==""?$2 OFS $3:b[$1] OFS $2 OFS $3}
  3.           END{for (i in b) print i,a[i],b[i]}' OFS=, test2 test1
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-06-28 11:56 |只看该作者
本帖最后由 有点浪有点漫 于 2012-06-28 11:59 编辑
rdcwayx 发表于 2012-06-28 10:50
TEST3 中要会用OFS.TEST4的代码


谢谢斑竹的解答,TEST4的代码学习了。

论坛徽章:
0
5 [报告]
发表于 2012-06-28 11:57 |只看该作者
本帖最后由 有点浪有点漫 于 2012-06-28 11:59 编辑

回复 3# rdcwayx


谢谢斑竹的解答,您辛苦了!
TEST4的代码我能理解,并学会了这样的用法。


TEST3的代码有点不明白,"{$1=$1 OFS a[$1]}1",这块内容
我认为,{$1=$1 OFS a[$1]}是在匹配的情况下将【TEST1中的第一列】+【,】+【TEST2中的第二列】
后面的一个数字1我就不明白是表示什么了,请指教。

TEST3的代码结果是:
0001|ChinaUnix论坛真是不错
0001,ChinaUnix论坛真是不错,01,0
0001,ChinaUnix论坛真是不错,02,0
0001,ChinaUnix论坛真是不错,03,0
0001,ChinaUnix论坛真是不错,04,0
0001,ChinaUnix论坛真是不错,05,0

第一行为什么会出现呢?


论坛徽章:
0
6 [报告]
发表于 2012-06-28 12:07 |只看该作者
回复 2# personball


    谢谢您的解答,不知道为什么我这里会显示【a[t]){a[t]=$0】这块内容有问题!

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
7 [报告]
发表于 2012-06-28 12:13 |只看该作者
有点浪有点漫 发表于 2012-06-28 11:57
回复 3# rdcwayx

第一行为什么会出现呢?


这个不清楚,也没注意。感觉应该是1 对两个文件都生效了。
我通常这样用的,就可以避免这种情况。
  1. awk -F \| 'NR==FNR{a[$1]=$2;next}{$1=$1 OFS a[$1]}1' OFS=, test2 test1
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP