免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk或sed如何读取带有字符的行文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-02 16:14 |只看该作者 |倒序浏览
各位shell高手,向大家请教个问题,望解答,谢谢!!!
   具体如下:一个文本文件,里面有很多数据,每段的数据以字符“X"分隔,想从该文件中提取每段数据,并将每段数据按100行间隔提取,存在一个文件里,不用字符"X“分隔。


一个文本文件格式为:
                    X
                    112323.2222   34.222223       1001
                     1124344444   222222222      3000
                     222222222     33333333        6666
                    .......                ..........
                    .......               ...........
                   X
                    222222222      2222222      999
                    33333333        4444444     2000
                     555555          555555       4000
                   ...........           .........
                   .........            ..........
                   X
                    4444444         5555555      2000
                     232323          45454545    3000
                    6767676          3232323     6000
                    ........             ..........        ......

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-09-02 16:21 |只看该作者
没太看明白你说的,你最好有个列子,想达到什么样的效果

论坛徽章:
0
3 [报告]
发表于 2014-09-02 16:48 |只看该作者
程序的思路是这样,按每行读取数据,当遇到字符”X"时,读取下一行数据回车,然后再间隔100行读取一行数据回车。。。。。,当再次遇到字符“X"时,与之前一样,读取下一行数据回车,然后再间隔100行读取一行数据回车。
      

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
4 [报告]
发表于 2014-09-02 16:51 |只看该作者
  1. [root@FILE_SHARE tmp]# cat b
  2. X
  3. 1 112323.2222   34.222223       1001
  4. 2 1124344444   222222222      3000
  5. 3 222222222     33333333        6666
  6. 4 112323.2222   34.222223       1001
  7. 5 1124344444   222222222      3000
  8. 6 222222222     33333333        6666
  9. 7 112323.2222   34.222223       1001
  10. 8 1124344444   222222222      3000
  11. 9 222222222     33333333        6666
  12. 10 112323.2222   34.222223       1001
  13. X
  14. 1 1124344444   222222222      3000
  15. 2 222222222     33333333        6666
  16. 3 112323.2222   34.222223       1001
  17. 4 1124344444   222222222      3000
  18. 5 222222222     33333333        6666
  19. 6 12323.2222   34.222223       1001
  20. 7 1124344444   222222222      3000
  21. 8 222222222     33333333        6666
  22. 9 112323.2222   34.222223       1001
  23. 10 1124344444   222222222      3000
  24. X
  25. 1 222222222     33333333        6666
  26. 2 112323.2222   34.222223       1001
  27. 3 1124344444   222222222      3000
  28. 4 222222222     33333333        6666
  29. 5 112323.2222   34.222223       1001
  30. 6 1124344444   222222222      3000
  31. 7 222222222     33333333        6666
  32. 8 112323.2222   34.222223       1001
  33. 9 1124344444   222222222      3000
  34. 10 222222222     33333333        6666
  35. [root@FILE_SHARE tmp]# awk 'BEGIN{RS="X";FS="\n"}NR>1{$1=$1;for(i=2;i<=NF;i=i+3)print $i}' b
  36. 1 112323.2222   34.222223       1001
  37. 4 112323.2222   34.222223       1001
  38. 7 112323.2222   34.222223       1001
  39. 10 112323.2222   34.222223       1001
  40. 1 1124344444   222222222      3000
  41. 4 1124344444   222222222      3000
  42. 7 1124344444   222222222      3000
  43. 10 1124344444   222222222      3000
  44. 1 222222222     33333333        6666
  45. 4 222222222     33333333        6666
  46. 7 222222222     33333333        6666
  47. 10 222222222     33333333        6666
复制代码
如果符合lz的想法把i=i+3改成i=i+100就ok了

论坛徽章:
0
5 [报告]
发表于 2014-09-02 17:01 |只看该作者
非常感谢!太牛了 回复 4# dn833


   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
6 [报告]
发表于 2014-09-02 17:04 |只看该作者
awk 'BEGIN{i=0;}{if($0 == "X") {line = NR + 1 ; next} if(NR == line ) {a[i] = $0; line+=100;i+=1;next}} END{for (i in a) print a[i]}' test

你试试这个 挺笨的方法

论坛徽章:
0
7 [报告]
发表于 2014-09-02 17:09 |只看该作者
如果保留每段数据的首行和尾行,中间间隔100行,好不好弄,谢谢!
一个文本文件格式为:
                    X
                    112323.2222   34.222223       1001      (提取该段数据首行)
                     1124344444   222222222      3000
                     222222222     33333333        6666      (中间间隔100行)
                    .......                ..........
                    .......               ...........
                   5555555     888888888             8888     (提取该数据最后一行)
                   X
                    222222222      2222222      999           (提取该段数据首行)
                    33333333        4444444     2000          (中间间隔100行)
                     555555          555555       4000
                   ...........           .........
                   .........            ..........
                   888888           3433333      7777          (提取该数据最后一行)

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
8 [报告]
发表于 2014-09-02 17:11 |只看该作者
回复 7# explorerlj

你看看6楼我说的 是不是满足你的需求

论坛徽章:
0
9 [报告]
发表于 2014-09-02 17:19 |只看该作者
结果与dn833不一样,好像循环有问题,不过还是要感谢你,谢谢!刚开始学,很多不太懂。回复 6# super皮波


   

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
10 [报告]
发表于 2014-09-02 17:21 |只看该作者
回复 9# explorerlj

我这有一点限制,要求X前不能有空格,我自己测试是没问题的
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP