免费注册 查看新帖 |

Chinaunix

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

[文本处理] 有点复杂我不知道标题怎么描述(文本处理) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-05 10:14 |只看该作者 |倒序浏览
258定义为A,369定义为B,147定义为C

0000
2580
3678
6571
1987
3825
5391
8302
4367
2317
7789
9426

我要的结果是:共生成三个文件,可以用三个SHELL来生成
258头的文件file1

2580  A580   
5391  A39C   5(这个5是5391-2580之间的间隔)
8302  A30A   1(这个1,是从5391到8302之间的间隔)
2317  A31C   2 (以此类推,这一行258开头的和上一个258开头的行之间的数

369开头的文件file2

3678 B67A
6571 B57C  1
3825 B82A  2
9426 B42B  6

147开头的文件file3

1987  C98C
4367  C98C     4
7789  C78B     2

不知道大家能看得明白吗?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-10-05 10:50 |只看该作者
回复 1# tyguaike
  1. $ echo '0000
  2. 2580
  3. 3678
  4. 6571
  5. 1987
  6. 3825
  7. 5391
  8. 8302
  9. 4367
  10. 2317
  11. 7789
  12. 9426' |awk 'BEGIN{t["147"]="C";t["258"]="A";t["369"]="B";
  13. for(i=1;i<=split("147|258|369",a,"|");i++){for(j=1;j<=split(a[i],b,"");j++){m[b[j]]=a[i]"|"t[a[i]]}}
  14. }
  15. {s=substr($0,1,1);md=substr($0,2,2);e=substr($0,4,1);
  16. x=NR-n[m[s]];
  17. if(s in m){print $0,(gensub(/[0-9]+\|/,"",1,m[s]) md gensub(/[0-9]+\|/,"",1,(m[e]?m[e]:e))),n[m[s]]?x:"" > gensub(/\|.*/,"",1,m[s])".txt";
  18. n[m[s]]=NR;}
  19. }'

  20. head 147.txt 258.txt 369.txt
  21. ==> 147.txt <==
  22. 1987 C98C
  23. 4367 C36C 4
  24. 7789 C78B 2

  25. ==> 258.txt <==
  26. 2580 A580
  27. 5391 A39C 5
  28. 8302 A30A 1
  29. 2317 A31C 2

  30. ==> 369.txt <==
  31. 3678 B67A
  32. 6571 B57C 1
  33. 3825 B82A 2
  34. 9426 B42B 6

复制代码

论坛徽章:
0
3 [报告]
发表于 2012-10-05 15:25 |只看该作者
yinyuemi 发表于 2012-10-05 10:50
回复 1# tyguaike



dong@dong-System-Product-Name:~/cp$ echo '0000
> 2580
> 3678
> 6571
> 1987
> 3825
> 5391
> 8302
> 4367
> 2317
> 7789
> 9426' |awk 'BEGIN{t["147"]="C";t["258"]="A";t["369"]="B";
> for(i=1;i<=split("147|258|369",a,"|");i++){for(j=1;j<=split(a,b,"");j++){m[b[j]]=a"|"t[a]}}
> }
> {s=substr($0,1,1);md=substr($0,2,2);e=substr($0,4,1);
> x=NR-n[m];
> if(s in m){print $0,(gensub(/[0-9]+\|/,"",1,m) md gensub(/[0-9]+\|/,"",1,(m[e]?m[e]:e))),n[m]?x:"" > gensub(/\|.*/,"",1,m)".txt";
> n[m]=NR;}
> }'
awk: line 9: function gensub never defined
awk: line 9: function gensub never defined
awk: line 9: function gensub never defined
出这个错了

怎么把你的代码作成.sh文件呀

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2012-10-05 22:57 |只看该作者
回复 3# tyguaike
  1. cat f.awk

  2. BEGIN{t["147"]="C";t["258"]="A";t["369"]="B";
  3. for(i=1;i<=split("147|258|369",a,"|");i++){for(j=1;j<=split(a[i],b,"");j++){m[b[j]]=a[i]"|"t[a[i]]}}
  4. }
  5. {s=substr($0,1,1);md=substr($0,2,2);e=substr($0,4,1);
  6. x=NR-n[m[s]];
  7. if(s in m){temp=(m[e]?m[e]:e);temp=substr(temp,length(temp),1)
  8. print $0,(substr(m[s],length(m[s]),1) md temp),n[m[s]]?x:"" > substr(m[s],1,length(m[s])-2)".txt";
  9. n[m[s]]=NR;}
  10. }

  11. awk -f f.awk file
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-10-06 17:32 |只看该作者
yinyuemi 发表于 2012-10-05 22:57
回复 3# tyguaike


不好意思呀,好像我不会用呀。你看看我用得对不对呀!
  1. dong@dong-System-Product-Name:~/cp$ cat 147.awk
  2. # 147,258,369,归类法
  3. # awk -f 147.awk file

  4. BEGIN{t["147"]="C";t["258"]="A";t["369"]="B";
  5. for(i=1;i<=split("147|258|369",a,"|");i++){for(j=1;j<=split(a[i],b,"");j++){m[b[j]]=a[i]"|"t[a[i]]}}
  6. }
  7. {s=substr($0,1,1);md=substr($0,2,2);e=substr($0,4,1);
  8. x=NR-n[m[s]];
  9. if(s in m){temp=(m[e]?m[e]:e);temp=substr(temp,length(temp),1)
  10. print $0,(substr(m[s],length(m[s]),1) md temp),n[m[s]]?x:"" > substr(m[s],1,length(m[s])-2)".txt";
  11. n[m[s]]=NR;}
  12. }
  13. dong@dong-System-Product-Name:~/cp$ cat 147test
  14. 0000
  15. 2580
  16. 3678
  17. 6571
  18. 1987
  19. 3825
  20. 5391
  21. 8302
  22. 4367
  23. 2317
  24. 7789
  25. 9426
  26. dong@dong-System-Product-Name:~/cp$ awk -f 147.awk 147test
  27. dong@dong-System-Product-Name:~/cp$
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-10-11 15:53 |只看该作者
哪个大哥帮忙看一下

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2012-10-11 16:37 |只看该作者
回复 6# tyguaike


    脚本运行完,会生成147.txt,258.txt和369.txt

论坛徽章:
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
8 [报告]
发表于 2012-10-11 16:54 |只看该作者
本帖最后由 jason680 于 2012-10-11 16:55 编辑

回复 1# tyguaike

How about this

# echo -e '0000\n2580\n3678\n6571
1987\n3825\n5391\n8302\n4367\n2317\n7789\n9426' |
awk -F '' 'BEGIN{a[0]="0";a[1]="C";a[2]="A";a[3]="B"}{if($1==0)next;t=($1-1)%3+1;w=a[t]$2$3a[($4-1)%3+1];p="";if(c[t])p=NR-c[t];c[t]=NR;f=(t+1)%3+1;print $0,w,p > "file"f}'

# head file1 file2 file3
==> file1 <==
2580 A580
5391 A39C 5
8302 A30A 1
2317 A31C 2

==> file2 <==
3678 B67A
6571 B57C 1
3825 B82A 2
9426 B42B 6

==> file3 <==
1987 C98C
4367 C36C 4
7789 C78B 2

   

论坛徽章:
0
9 [报告]
发表于 2012-10-12 21:36 |只看该作者
yinyuemi 发表于 2012-10-11 16:37
回复 6# tyguaike


是哦,我的目录下太乱了。呵呵
谢谢!

论坛徽章:
0
10 [报告]
发表于 2012-10-12 21:45 |只看该作者
jason680 发表于 2012-10-11 16:54
回复 1# tyguaike

How about this


是的,你的也是对了。不错。不过为什么每个码前面加个n呀
你这个好像代码还少一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP