免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 927 | 回复: 5

[文本处理] 请教多个文本合并的判断问题 [复制链接]

论坛徽章:
0
发表于 2019-05-20 17:30 |显示全部楼层
本帖最后由 yexingqi 于 2019-05-20 17:34 编辑

请教一下,我有多个文件,每个文件内容本每行的数据是用 “;” 号来分隔,“;” 号前面可能有一个或多个的空格。

例如:
cat file1.txt
wangxiqi-1;10.10.17.35;c4346b5cd373;linux; HR;3F_A03;man;xxx;
wangxiqi-2;10.10.17.36;c4346b5cd375;linux;HR ;3F_A03 ;man ;xxx ;

cat file2.txt
wangxiqi-1;10.10.17.35;c4346b5cd373;linux;  ; ;  ;xxx;
wangxiqi-3;10.10.17.38;c4346b5cd374;linux;HR ;3F_A03 ;man ;xxx ;


我希望对多个这样的文件进行合并. 并做以下判断:
1. 如果所有的文件第二列和第四列的内容都是都是相同的(红色部分),那么自动把它合并.只保留最完整的一份(分隔符号";" 里的数据最多的一份保留.)
2. 如果所有的文件第二列和第四列的内容在其它的文件不存在,那么它就会加到新的合并文件那里去.

最终出现这种结果: (所有的空格被自动清除)
cat finally.txt
wangxiqi-1;10.10.17.35;c4346b5cd373;linux;HR;3F_A03;man;xxx;
wangxiqi-2;10.10.17.36;c4346b5cd375;linux;HR;3F_A03;man ;xxx ;
wangxiqi-3;10.10.17.38;c4346b5cd374;linux;HR;3F_A03;man ;xxx ;

请问如何实现呢? 实在是太复杂.想了好久都没有实现成功. .....  我先提前谢过您了!




论坛徽章:
0
发表于 2019-05-20 23:07 |显示全部楼层
本帖最后由 jzsjm1002 于 2019-05-20 23:25 编辑

回复 1# yexingqi

  1. cat test.awk
  2. #!/usr/bin/awk -f
  3. #

  4. BEGIN{FS=";"}

  5. {nr[$1,$2,$4][length($0)]=gensub(/\s/,"","g")}

  6. END{
  7.   PROCINFO["sorted_in"]="@ind_num_asc"
  8.   for(x in nr){
  9.     for(y in nr[x])
  10.       len=(y>len?y:len)
  11.     print nr[x][len]
  12.     len=0
  13.   }
  14. }

  15. ./test.awk file1.txt file2.txt
  16. wangxiqi-1;10.10.17.35;c4346b5cd373;linux;HR;3F_A03;man;xxx;
  17. wangxiqi-2;10.10.17.36;c4346b5cd375;linux;HR;3F_A03;man;xxx;
  18. wangxiqi-3;10.10.17.38;c4346b5cd374;linux;HR;3F_A03;man;xxx;

  19. awk --version
  20. GNU Awk 4.0.2
复制代码


评分

参与人数 1信誉积分 +10 收起 理由
yexingqi + 10 很给力!

查看全部评分

论坛徽章:
0
发表于 2019-05-21 10:01 |显示全部楼层
回复 2# jzsjm1002

利害啊.佩服佩服, 脚本不多但完全实现了我想要的结果. 可惜我不太懂awk,没看懂您的思路....

谢谢!


另外请问一下,如果用shell能实现么?

论坛徽章:
0
发表于 2019-05-21 12:58 |显示全部楼层
我说说解体步骤:
1去掉空格tab。
2合并文件。
这两步手动也行。
3ip字段排序。
4取前后两条数据,对比24字段(字符串)和,如果相同,则保留 字段和长度长的。
5取吓一条继续对比。
有点麻烦,也不算太麻烦,脚本我就偷懒了。



评分

参与人数 1信誉积分 +6 收起 理由
yexingqi + 6 很给力!

查看全部评分

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2019-05-21 13:16 |显示全部楼层
  1. awk -F';' '{gsub(/[ \t]/,"");c=0;for(i=1;i<=NF;i++)if($i)++c;k=$2$4;if(c>b[k]){a[k]=$0;b[k]=c}}!e[k]++{d[++j]=k}END{while(x++<j)print a[d[x]]}' file1.txt file2.txt
复制代码


评分

参与人数 1信誉积分 +7 收起 理由
yexingqi + 7 很给力!

查看全部评分

论坛徽章:
0
发表于 2019-05-21 14:08 |显示全部楼层
回复 3# yexingqi

可以 会有些麻烦   文本处理建议用awk
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

ITPUB技术栈

ITPUB技术栈是ITPUB企业打造的垂直于IT领域的知识社群平台,在这里,你既可以是创作者也可以是消费者。如果你的IT生涯丰富多彩,喷薄的个人价值尽可在小栈内体现;如果你渴望找到志同道合的伙伴,拓宽人脉,小栈比跑会场更快。 小栈特色:
1.极高的用户转化率,实现更直接的知识变现;
2.随时随地,刷个朋友圈的时间,实现更长效的信息沉淀;
3.戳痛、难点的专业咨询,更接近成功解决方案的时刻;
4.贴近意见领袖,个人高速成长,迈入更富有价值的人际圈。

----------------------------------------

技术小栈>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP