免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: greaterwei
打印 上一主题 下一主题

[文本处理] 寻找文件中的多行多列内容并输出对应行(比较繁琐,谢谢) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2017-09-14 18:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
32 [报告]
发表于 2017-09-14 21:16 |只看该作者
回复 25# greaterwei

文件refs.dat内容如下:
ACBACU        ACPRCU        aaa
ACCAFA        ADESXA        bbb
CATPAL        AOXSCH        ccc
CDACET        111           ddd
CDCAZA

文件cons.dat内容如下:
ACBACU    1.397    0.854    2.782    0    0    0.211    4    4    4    4    4    4        
ACPRCU    3.535    2.441    1.565    0    0    0.373    3    2    3    3    2    3        
AOXSCH    2.159    1.340    3.080    0    0    0.365    3    2    3    3    2    3        
CATPAL    3.807    2.039    2.788    0    0    0.386    4    3    3    4    3    3        
CDCAZA    4.439    2.496    1.525    0    0    0.390    3    1    3    3    1    3

以下代码适合任意列,重新生成的文件ref-left.dat每列的行数是不同的,因此为了保证数据的准确性防止串列,增加了“---”符号。
  1. awk 'FILENAME==ARGV[1]{a[$1]=$0;next}{m=m>NF?m:NF;for(i in a){for(j=1;j<=NF;j++){if($j~i){$j="";print a[i]>j".dat"}}}}{for(i=1;i<=NF;i++){s[i]=s[i]?s[i]" "$i:$i}}END{for(i=1;i<=m;i++){split(s[i],t);n=n>length(t)?n:length(t)};for(i=1;i<=m;i++){split(s[i],t);for(j=1;j<=n;j++){t[j]=t[j]?t[j]:"---";p[j]=p[j]?p[j]" "t[j]:t[j]}}for(i=1;i<=n;i++){print p[i]>"ref-left.dat"}}' cons.dat refs.dat
复制代码


输出:
$ cat 1.dat
ACBACU    1.397    0.854    2.782    0    0    0.211    4    4    4    4    4    4        
CATPAL    3.807    2.039    2.788    0    0    0.386    4    3    3    4    3    3        
CDCAZA    4.439    2.496    1.525    0    0    0.390    3    1    3    3    1    3        

$ cat 2.dat
ACPRCU    3.535    2.441    1.565    0    0    0.373    3    2    3    3    2    3        
AOXSCH    2.159    1.340    3.080    0    0    0.365    3    2    3    3    2    3        

$cat ref-left.dat
ACCAFA ADESXA aaa
CDACET 111 bbb
--- --- ccc
--- --- ddd

论坛徽章:
0
33 [报告]
发表于 2017-09-14 21:55 |只看该作者
本帖最后由 greaterwei 于 2017-09-14 22:04 编辑

回复 31# 本友会机友会摄友会

好的,十分感谢大神! 我再琢磨琢磨

论坛徽章:
0
34 [报告]
发表于 2017-09-14 22:02 |只看该作者
回复 32# wh7211

十分感谢!您的代码在数据量少的时候非常好使!!!
但是数据一多后就不能输出文件了,而且ref-left就会出现错误,不知道什么原因。

数据输入的时候我需要注意什么么? 谢谢!

求职 : 数据库管理员
论坛徽章:
0
35 [报告]
发表于 2017-09-15 00:58 |只看该作者
awk 'NR==FNR{for(i=1;i<=NF;i++){a[NR""i]=$i } col=(col<NF)?NF:col; row=NR; next}{b[$1]=$0 }END{for(i=1;i<=row;i++){for( j=1;j<=col;j++){if(b[a[i""j]]!=""){print b[a[i""j]] > j".dat"; a[i""j]="" } printf("%-6s ",a[i""j]) > "ref-left.dat"}printf("\n") > "ref-left.dat"} }' refs.dat cons.dat

论坛徽章:
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
36 [报告]
发表于 2017-09-15 13:50 |只看该作者
本帖最后由 wh7211 于 2017-09-15 14:53 编辑

回复 34# greaterwei

从给定的信息来看:
文件cons.dat:20万行
文件refs.dat:行数不确定,46列或50列


awk处理20万行数据不会有任何压力,请检查一下源文件是否是格式化文档。另外可以把文件ref-left出现错误的截图贴上来分析一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP