免费注册 查看新帖 |

Chinaunix

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

[文本处理] 用awk数组同时重定向到多个文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-10 22:48 |只看该作者 |倒序浏览
本帖最后由 richiewu 于 2015-09-30 11:30 编辑

输入:
"01","1008","0","10080539"
"01","1013","X","10080539"
"03","1007","0","20110625"
"03","1076","X","20110625"

如果$4相同则认为是同一组,追加到首次出现$4的行中以$1_$2命名的文件

输出多个文件,文件名为$1_$2:
01_1008包含两行:
"01","1008","0","10080539"
"01","1013","X","10080539"

03_1007包含另外两行:
"03","1007","0","20110625"
"03","1076","X","20110625"

对awk数组不熟悉特求助


用了3#的方案awk -vFS='"|","' '{ if (!a[$5]) a[$5] = $2 "_" $3; print >> a[$5] }'

但如果要把所有第四列相同的行分别重定向到$2"_"$3命名的文件中呢
输出多个文件,文件名为$1_$2:
01_1008包含两行:
"01","1008","0","10080539"
"01","1013","X","10080539"

01_1013包含两行:
"01","1008","0","10080539"
"01","1013","X","10080539"

03_1007包含另外两行:
"03","1007","0","20110625"
"03","1076","X","20110625"

03_1076包含另外两行:
"03","1007","0","20110625"
"03","1076","X","20110625"

论坛徽章:
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
2 [报告]
发表于 2015-08-10 23:14 |只看该作者
回复 1# richiewu

$ awk -F, -vq='"' '{s=$0;gsub(q,"");if(!c[$4]++){f[$4]=$1"_"$2};k=f[$4];a[k]=a[k]s"\n"}END{for(n in f){print "file:"f[n];printf  a[f[n]] >f[n]}}' FILE
file:03_1007
file:01_1008


$ grep . 03_* 01_*
03_1007:"03","1007","0","20110625"
03_1007:"03","1076","X","20110625"
01_1008:"01","1008","0","10080539"
01_1008:"01","1013","X","10080539"

   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2015-08-10 23:16 |只看该作者
回复 1# richiewu


    try this:

  1. awk -vFS='"|","' '{ if (!a[$5]) a[$5] = $2 "_" $3; print >> a[$5] }'
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2015-08-10 23:18 |只看该作者
回复 1# richiewu
  1. awk -F, '!a[$4]++{f=gensub(/"/,"","g",$1"_"$2);b[$4]=f}{print >b[$4]}' OFS=, file
复制代码

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
5 [报告]
发表于 2015-08-11 10:12 |只看该作者
这个思路不错。回复 3# MMMIX


   

论坛徽章:
0
6 [报告]
发表于 2015-09-30 10:42 |只看该作者

richiewu

MMMIX 发表于 2015-08-10 23:16
回复 1# richiewu


但如果要把所有第四列相同的行分别重定向到$2"_"$3命名的文件中呢
输出多个文件,文件名为$1_$2:
01_1008包含两行:
"01","1008","0","10080539"
"01","1013","X","10080539"

01_1013包含两行:
"01","1008","0","10080539"
"01","1013","X","10080539"

03_1007包含另外两行:
"03","1007","0","20110625"
"03","1076","X","20110625"

03_1076包含另外两行:
"03","1007","0","20110625"
"03","1076","X","20110625"

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2015-09-30 14:26 |只看该作者
[ 本帖最后由 MMMIX 于 2015-09-30 14:32 编辑 ]

[b]回复 [url=forum.php?mod=redirect&goto=findpost&pid=&ptid=4185213]6#[/url] [color=Olive]richiewu[/color] [/b]


    循环两遍就是了:

BEGIN {
    FPAT = "[0-9X]+"
}

{
    if ($4 in r) {
        n = length(r[$4][0])
        r[$4][0][n] = $1 "_" $2
        r[$4][1][n] = $0
    } else {
        r[$4][0][0] = $1 "_" $2
        r[$4][1][0] = $0
    }
}

END {
    for (i in r) {
        for (p in r[i][0]) {
            for (q in r[i][1]) {
                print r[i][1][q] >> "/tmp/" r[i][0][p]
            }
        }
    }
}

论坛徽章:
0
8 [报告]
发表于 2015-10-15 15:56 |只看该作者

richiewu

回复 7# MMMIX


    谢谢,有空进一步学习下awk,目前只会些初级的
写了awk代码过一段时间自己都忘了什么意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP