免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何快速实现文本按索引文件的次序合成一个新文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2021-12-15 21:32 |只看该作者 |倒序浏览
$ cat name.txt
zhangsan
lisi
wangwu
houliu
liuqi
zhaojiu
....

$ cat 01.txt
zhangsan 3500.25
lisi 3621.52
wangwu 2995.41
houliu 3802.05
liuqi 2812.88
....

$ cat 02.txt
zhangsan 2967.32
lisi 2916.33
houliu 3217.09
liuqi 3501.48
....

$ cat 03.txt
zhangsan 3456.78
lisi 2926.22
wangwu 3027.66
liuqi 2298.34
....

需求:按name.txt中的名字将每个月的金额(01.txt、02.txt .... )合成一个文件(字段分隔符为逗号)如下:
name,01,02,03
zhangsan,3500.25,2967.32,3456.78
lisi,3621.52,2916.33,2926.22
wangwu,2995.41,,3027.66
houliu,3802.05,3217.09,
liuqi,2812.88,3501.48,2298.34
zhaojiu,,,
....
其中“wangwu”和“houliu”因有字段为空值而与其它人的信息不同。
请教如何简明而高效地实现?谢谢!


论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-10-11 06:20:0015-16赛季CBA联赛之山东
日期:2016-05-28 18:18:5615-16赛季CBA联赛之新疆
日期:2017-04-12 22:55:4715-16赛季CBA联赛之青岛
日期:2017-06-26 18:30:0315-16赛季CBA联赛之四川
日期:2017-09-04 12:27:0315-16赛季CBA联赛之福建
日期:2018-02-09 14:28:3315-16赛季CBA联赛之同曦
日期:2018-04-17 12:43:3415-16赛季CBA联赛之浙江
日期:2018-07-14 13:27:4015-16赛季CBA联赛之吉林
日期:2018-09-13 15:48:2915-16赛季CBA联赛之新疆
日期:2016-05-07 05:05:3215-16赛季CBA联赛之八一
日期:2016-03-14 12:32:06程序设计版块每日发帖之星
日期:2015-12-12 06:20:00
2 [报告]
发表于 2021-12-16 10:14 |只看该作者
  1. [root@test-02 aa]# awk 'ARGIND<4{a[$1]=a[$1]","$2}ARGIND==4{print $1""a[$1]}' 01.txt  02.txt  03.txt name.txt
  2. zhangsan,3500.25,2967.32,3456.78
  3. lisi,3621.52,2916.33,2926.22
  4. wangwu,2995.41,3027.66
  5. houliu,3802.05,3217.09
  6. liuqi,2812.88,3501.48,2298.34
  7. zhaojiu
复制代码

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
3 [报告]
发表于 2021-12-16 11:18 |只看该作者
  1. [monitor@b03hljk8scrm011 ~]$ awk 'ARGIND==4{printf $0",";for(b=0;b++<n;){a[$1" "b]=(b<n)?a[$1" "b]",":a[$1" "b]"\n";printf a[$1" "b]};next}FNR==1{n++}{a[$1" "n]=$NF}' *.txt
  2. zhangsan,3500.25,2967.32,3456.78
  3. lisi,3621.52,2916.33,2926.22
  4. wangwu,2995.41,,3027.66
  5. houliu,3802.05,3217.09,
  6. liuqi,2812.88,3501.48,2298.34
  7. zhaojiu,,,
复制代码

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2021-12-16 16:37 |只看该作者
回复 1# xxinganling


  1. awk 'BEGIN{print "name,01,02,03"}FILENAME!=ARGV[4]{if(!a[FILENAME]++){b++};c[$1][b]=$2}FILENAME==ARGV[4]{for(i=1;i<=b;i++){d=i==1?c[$1][i]:d","c[$1][i]};print $1","d;d=""}' 01.txt 02.txt 03.txt name.txt
复制代码

论坛徽章:
0
5 [报告]
发表于 2021-12-16 19:57 |只看该作者
感谢baby_神、LikeLx、wh7211,我在ubuntukylin-20.04上试了下:

如附件图


没有得到输出,请帮助看一下问题出在哪里了?再次感谢!



Err.png (59.28 KB, 下载次数: 150)

Err.png

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
6 [报告]
发表于 2021-12-16 21:23 |只看该作者
本帖最后由 wh7211 于 2021-12-16 21:25 编辑

回复 5# xxinganling


看一下awk版本:
  1. awk --version
复制代码

论坛徽章:
0
7 [报告]
发表于 2021-12-18 09:41 |只看该作者
$ awk --version
awk: not an option: --version

man awk 也没有看版本的选项。

另外用系统中的nawk运行三位大神的脚本,提示与用awk相同。


论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
8 [报告]
发表于 2021-12-19 00:08 |只看该作者
本帖最后由 wh7211 于 2021-12-19 00:15 编辑

回复 7# xxinganling


需要安装gawk。

论坛徽章:
0
9 [报告]
发表于 2021-12-19 16:06 |只看该作者
安装gawk-5.1.1,运行后出现了比较怪的情形,如附图,01、02、03的数据丢了,name放在最后,而且显示不全。
数据文件是从Windows机器复制过来的,难道和这有关?


001.png (27.73 KB, 下载次数: 139)

001.png

002.png (41.06 KB, 下载次数: 136)

002.png

003.png (17.18 KB, 下载次数: 140)

003.png

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
10 [报告]
发表于 2021-12-20 13:08 |只看该作者
本帖最后由 wh7211 于 2021-12-20 13:12 编辑

回复 9# xxinganling


1、删除文件name.txt中的空行;
2、转换文件格式;
  1. dos2unix 01.txt 02.txt 03.txt name.txt
复制代码

3、运行gawk命令。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP