免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 处理逗点分隔符文件(csv) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-25 16:02 |只看该作者 |倒序浏览
逗点分隔符文件可看作多列,每列之间一逗号分开,现有一文件150列,500行,现在需要多次对源文件(src)进行提取某些列获得一个新的文件,比如第一次要提取23、34、45、56、57、68、72、89、90、100、102、124、125、130、142这些列,第二次提取1、3、5、6、8、42、63、73、84、89、90、96、105、107、137、149这些列,每次要提取的这些列记录在一个文件sc中

现在有一个思路(shell文件):
1、把记录要提取的列的sc文件中列读入一个数组sc,每一个数组元素记录一个列数
2、遍历源文件src,对每一行用awk进行处理:先split一逗号为分隔符分离,存入数组START,现在START中为当前行的每一个数据项,然后循环打印START[ $sc[ i ] ],当然间隔打印一个逗号,最后打印一个换行符
现在遇到一个问题,$sc [ i ]要访问sc数组,但是awk无法访问该数组,这个能解决吗?
或者用其他方法

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2012-07-25 16:04 |只看该作者
直接用awk的数组记录列

论坛徽章:
0
3 [报告]
发表于 2012-07-25 16:16 |只看该作者
awk -v file=urfile -F "," 'BEGIN{
                while ( getline value < file ) {
                        H[value]=value;
                }
                }
                {       for (k in H) printf $k" "; printf "\n"}' a.log

urfile 里面填你要打印的列

论坛徽章:
0
4 [报告]
发表于 2012-07-25 16:20 |只看该作者
回复 1# YuZile
  1.     personball@vostro:~$echo 'a,b,c,d,e'|cut -d, -f1,3,5
  2. a,c,e
  3. personball@vostro:~$
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-07-25 16:22 |只看该作者
回复 2# waker


    不好打印啊
    求详解?

论坛徽章:
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 [报告]
发表于 2012-07-25 16:27 |只看该作者
awk 就可以了。不必再split。

论坛徽章:
0
7 [报告]
发表于 2012-07-25 16:34 |只看该作者
回复 3# dwj19830118

awk -v file=urfile -F "," 'BEGIN{
                while ( getline value < file ) {
                        H[value]=value;
                }
                }
                {       for (k in H) printf $k" "; printf "\n"}' a.log

    这个真没干这么写,awk能这么打印真没想到

论坛徽章:
0
8
发表于 2012-07-25 16:37
回复 4# personball


    不用awk,这个大概是最简洁的做法了,就算列是乱序也能自动排序使列的相对顺序不变

论坛徽章:
0
9 [报告]
发表于 2012-07-25 16:39 |只看该作者
回复 6# blackold


    dwj19830118的做法就是,我一开始没想到打印效果是这样的,然后就高复杂了

论坛徽章:
0
10 [报告]
发表于 2012-07-25 17:23 |只看该作者
继续搞cut
  1. cat sc |xargs -I {} cut -d, -f{} data > data.new
复制代码
虽然提取了列。。不过最终输出的数据是在一个文件里的。。。由于原始文件行数固定,这个文件分割也不算麻烦吧,哈。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP