第一个文件内数据: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)
第二个文件没有就跳过 不拷贝
24.700199 102.143997 27.322100 103.717903 3.617 1 (第三个文件中的数据)
...
...
就这样形成一个新的文件,该怎么实现bash shell脚本啊。谢谢!
还是用python等脚本简单。
首先把所有文件都放在一个目录下,grep —rA2000 35.0 > ~/tmpA && grep -rB 2000 35.0 > ~/tmpB 然后。cd ~ 再然后。cat tmpA |grep -v 35.0 > tmpA && cat tmpB |grep -v 35.0 > tmpB
for i in *.dat
do
if grep 35.0 $i>temp
then
sed -n 1,2p $i>temp2.txt
cut -c 6- temp >>temp2.txt
echo "1" >>temp2.txt
cat temp2.txt
sed ':a;N;$!ba;s/\r/ /g' temp2.txt| sed ':a;N;$!ba;s/\n/ /g' >>35.txt
echo “\n”>>35.txt
fi
done
在文件夹下执行就可以了
只测试了第三个文件,
for i in *.dat
do
a=`awk '{print $1}' $i|grep '35.0$'` #取文件第一列以“35.0”结尾的
if [ -n "$a" ]
then
nnn=`awk '{print $1}' $i|grep -n '35.0$'|awk -F: '{print $1}'` #取文件第一列以“35.0”结尾的行号
bbb=`awk 'NR==3{print $2}' $i`
head1=`awk 'NR==1' $i`
head2=`awk 'NR==2' $i`
echo "${head1} ${head2} ${bbb} 1" >>35.txt
fi
done
把 .dat 文件放在一个文件夹下执行即可。