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
$ awk 'FNR<=2{a[FNR]=$2" "$1};$1=="35.0"{print a[1],a[2],$2,"1"}' 1 2 3
25.029301 101.535599 23.501900 100.735100 3.591 1
24.700199 102.143997 27.322100 103.717903 3.617 1
复制代码
刚才格式不对, 已改
作者:
songyc_2015
时间:
2015-06-15 21:23
回复
1#
tengfei0311
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 编辑
#!/bin/bash
for i in $(ls *.txt);do
a=$(grep "^35.0" $i)
if [ -n "$a" ];then
head -n 2 $i | while read a b;do
echo -n $b" "$a" "
done
echo ${a#* }" 1"
fi
done
复制代码
作者:
rulebook
时间:
2015-06-16 11:47
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
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