shell脚本读取文件内的内容, 并生产一个新文件。 2C

第一个文件内数据: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脚本啊。谢谢!

4个回答

还是用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 文件放在一个文件夹下执行即可。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问