免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 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
3 [报告]
发表于 2019-05-21 10:01 |只看该作者
回复 2# jzsjm1002

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

谢谢!


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

论坛徽章:
0
4 [报告]
发表于 2019-05-21 12:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
5 [报告]
发表于 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
复制代码


评分

参与人数 2可用积分 +6 信誉积分 +13 收起 理由
vcdtwo + 6 + 6 赞一个!
yexingqi + 7 很给力!

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2019-05-21 14:08 |只看该作者
回复 3# yexingqi

可以 会有些麻烦   文本处理建议用awk

论坛徽章:
0
7 [报告]
发表于 2019-07-04 07:08 |只看该作者
本帖最后由 csccyab 于 2019-07-04 14:58 编辑

#!/usr/bin/awk -f

BEGIN{FS=";"}

{
gsub(/\s/,"",$0)
if (a[$1,$2,$4]) {
   n1 = split($0, array, ";")
   n2 = length(a[$1,$2,$4])
   if (n1 > n2)
      a[$1,$2,$4] = $0
} else
   a[$1,$2,$4] = $0
}

END {
PROCINFO["sorted_in"]="@ind_num_asc"
for (i in a)
   print a
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP