免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助:shell读取文件内的内容 [复制链接]

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-15 20:15 |只看该作者 |倒序浏览
本帖最后由 tengfei0311 于 2015-06-15 20:27 编辑

第一个文件内数据:1.dat
101.535599     25.029301
100.735100     23.501900

35.0   3.591
36.0   3.618
37.0   3.647
38.0   3.681
39.0   3.719
40.0   3.752

第二个数据文件:2.dat
101.860703     25.689400
99.698402     27.823200

41.0   3.698
42.0   3.715
43.0   3.732
44.0   3.747
45.0   3.762
46.0   3.777
47.0   3.792
48.0   3.807
49.0   3.820
50.0   3.834

第三个文件数据:3.dat
102.143997     24.700199
103.717903     27.322100

30.0   3.562
31.0   3.557
32.0   3.562
33.0   3.575
34.0   3.595
35.0   3.617
36.0   3.639
37.0   3.658
38.0   3.681
39.0   3.708
40.0   3.735



我现在有600多个这样的文件,现在以3个文件为例。
假如我现在要搜索每一个文件里面35.0这一行的值,如果文件有35.0的值,把35.0后面一个值拷贝到新的文件中,并把头两行拷贝在新文件中。如果没有这个35.0就跳过这个文件,不做任何操作。

例如:第一个文件里面有35.0的值,就拷贝出来,形成新的格式如下(新的文件名:35.txt):
25.029301  101.535599  23.501900  100.735100  3.591  1   (第一个文件中的数据,如35.0这个后面有值的,在后面全部加1(指红色的1))
第二个文件没有就跳过 不拷贝
24.700199  102.143997  27.322100  103.717903  3.617 1   (第三个文件中的数据)
...
...

就这样形成一个新的文件,该怎么实现bash shell脚本啊。谢谢!

论坛徽章:
0
2 [报告]
发表于 2015-06-15 20:59 |只看该作者
本帖最后由 bianlimit 于 2015-06-15 21:01 编辑

回复 1# tengfei0311
  1. $ awk 'FNR<=2{a[FNR]=$2" "$1};$1=="35.0"{print a[1],a[2],$2,"1"}' 1 2 3
  2. 25.029301 101.535599 23.501900 100.735100 3.591 1
  3. 24.700199 102.143997 27.322100 103.717903 3.617 1
复制代码
刚才格式不对, 已改

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
3 [报告]
发表于 2015-06-15 21:23 |只看该作者
回复 1# tengfei0311
  1. awk 'f!=FILENAME{s=""}FNR<3{f=FILENAME;for(i=1;i<=NF;i++)s=s?s OFS $i:$i}$1=="35.0"{print s,$2,"1" > FILENAME"_35.txt";}' 1 2 3
复制代码
不明后面的那个1是什么?每一个文件中是否会有多个35.0行?

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
4 [报告]
发表于 2015-06-15 21:43 |只看该作者
回复 2# bianlimit

谢谢您,你这个代码是对的。
35.0是时间,指35s,后面是35s对应的值,如果有值就是1。这个1就是这个意思,是数据反演的一个格式,必须要加一个1.呵呵

   

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
5 [报告]
发表于 2015-06-15 21:49 |只看该作者
回复 3# songyc_2015

谢谢,我每个文件都只有一个35s,这个第一列是时间。一楼大哥是对的。

   

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
6 [报告]
发表于 2015-06-16 09:58 |只看该作者
本帖最后由 lifayi2008 于 2015-06-16 10:25 编辑
  1. #!/bin/bash

  2. for i in $(ls *.txt);do
  3.         a=$(grep "^35.0" $i)
  4.         if [ -n "$a" ];then
  5.                 head -n 2 $i | while read a b;do
  6.                         echo -n $b" "$a" "
  7.                 done
  8.                 echo ${a#* }" 1"
  9.         fi
  10. done
复制代码

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
7 [报告]
发表于 2015-06-16 11:47 |只看该作者
  1. awk 'FNR==1{if(n!=0){str=str!=""?str"\n"s" "n:s" "n};s="";s=$2" "$1;n=0} FNR==2{s=s" "$2" "$1} $1=="35.0"{s=s" "$2;n++}END{if(n==1){str=str!=""?str"\n"s" "n:s" "n};print str}' `ls *.dat`
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
8 [报告]
发表于 2015-06-16 11:54 |只看该作者
  1. awk 'FNR<3{a[FILENAME]=a[FILENAME]FS$1FS$2;next} $1=="35.0"{print a[FILENAME],$2,1;nextfile}'  urfiles  >out_file
复制代码

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
9
发表于 2015-06-16 13:42
回复 6# lifayi2008

谢谢,已经搞定了,感谢你们的帮助。

   

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
10 [报告]
发表于 2015-06-16 13:43 |只看该作者
谢谢,已经搞定了回复 7# rulebook


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP