免费注册 查看新帖 |

Chinaunix

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

【请教】Paste时如何控制列不错位 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-25 13:19 |只看该作者 |倒序浏览
本帖最后由 keke00 于 2010-09-25 15:31 编辑

有许多csv文档,每个文档2列,行数不定,如下
文档1.csv:
  1. 1A2007,1A2008
  2. 1B2008,1B2009
  3. 1A2009,1A2010
  4. 1E2010,
  5. 1A2011,
复制代码
文档2.csv:
  1. 2A2007,2A2008
  2. 2B2009,
  3. 2A2010,
复制代码
文档3.csv:
  1. 3A2007,3A2008
  2. 3B2008,3A2009
  3. 3A2009,
  4. 3E2010,
  5. 3A2011,
复制代码
现在想按列合并成一个csv档,效果图如下:

合并后csv文档数据:
  1. 1A2007,1A2008,2A2007,2A2008,3A2007,3A2008
  2. 1B2008,1B2009,2B2009,,3B2008,3A2009
  3. 1A2009,1A2010,2A2010,,3A2009,
  4. 1E2010,,,,3E2010,
  5. 1A2011,,,,3A2011,
复制代码
想用paste,不知如何控制列不错位(因为空的栏位要用,逗号来填充才不错位)。。
特请教高手如何实现?

论坛徽章:
0
2 [报告]
发表于 2010-09-25 14:54 |只看该作者
回复 1# keke00

paste 不会啊 能完成吗?
试试这个吧,呵呵 写的太复杂了
  1. awk -F, '{if(FILENAME!=fl){fn++;fl=FILENAME;for(t=1;t<=k;t++){while(gsub(",",",",a[t])<2*(fn-1)){a[t]=a[t]","}}};if(FNR>k&&fn>1){for(g=1;g<fn;g++){a[FNR]=a[FNR]",,"}};a[FNR]=a[FNR]""$1","$2",";k=FNR>k?FNR:k}END{for(n=1;n<=k;n++){print a[n]}}' *.csv |sed 's#.$##'
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2010-09-25 14:54 |只看该作者
你这太难,行尾有没有逗号全没准啊

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-09-25 15:29 |只看该作者
本帖最后由 L_kernel 于 2010-09-25 16:13 编辑

我不知道你是怎么从上面的三个文档得到那个合并后的CVS文档的。我就不管了,既然你可以得到,我直接使用你合并后的CVS文档。如下:
  1. $ cat file | awk '{split($1,x,",");print x[1]"\t"x[2]"\t"x[3]"\t"x[4]"\t"x[5]"\t"x[6]}'
复制代码
方法比较笨拙,也许可以用循环实现。如果你的输出列数比较多的话。
输出结果:

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2010-09-25 16:03 |只看该作者
回复 1# keke00


    paste把整个文件当作"一列“,不能解决处理你给定的格式。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2010-09-25 16:09 |只看该作者
本帖最后由 blackold 于 2010-09-25 16:23 编辑

用join写一个,有长度
  1. join -t, -a 1 -a 2 -o 1.2,1.3,1.4,1.5,2.2,2.3<(join -t, -a 1 -a 2 -o 1.1,1.2,1.3,2.2,2.3 <(nl -s, file1) <(nl -s, file2)) <(nl -s, file3)
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-09-25 16:09 |只看该作者
本帖最后由 truenight0 于 2010-09-25 16:11 编辑
  1. paste -d '-' 1.cvs 2.cvs 3.cvs |
  2. awk -F '-' '
  3. {
  4.     for(i=1;i<NF;i++)
  5.         if($i=="")
  6.             printf $i",,";
  7.         else
  8.             printf $i",";

  9.     if($i=="")
  10.         printf $i",";
  11.     else
  12.         printf $i;

  13.     printf "\n";
  14. }'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP