Chinaunix

标题: 求助:shell读取文件内的内容 [打印本页]

作者: tengfei0311    时间: 2015-06-15 20:15
标题: 求助:shell读取文件内的内容
本帖最后由 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脚本啊。谢谢!

作者: bianlimit    时间: 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
复制代码
刚才格式不对, 已改
作者: songyc_2015    时间: 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行?
作者: tengfei0311    时间: 2015-06-15 21:43
回复 2# bianlimit

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

   
作者: tengfei0311    时间: 2015-06-15 21:49
回复 3# songyc_2015

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

   
作者: lifayi2008    时间: 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
复制代码

作者: rulebook    时间: 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`
复制代码

作者: 关阴月飞    时间: 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
复制代码

作者: tengfei0311    时间: 2015-06-16 13:43
谢谢,已经搞定了回复 7# rulebook


   
作者: tengfei0311    时间: 2015-06-16 13:43
谢谢,已经搞定了回复 8# 关阴月飞


   
作者: 聆雨淋夜    时间: 2015-06-16 14:16
awk 'NR==1{a=$2" "$1;getline;b=$2" "$1" "a}{if($1=="35.0")print b" "$2" 1">>"35.txt"}' *.dat




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2