计算之道

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

5、一些短脚本

(9)计算平均氢键数量,以及平均界面面积

##hbond
hb_ave=$(awk 'NR > 1 {sum += $2 + $3} END {if (NR > 1) print sum / (NR - 1)}' "HB.dat")
echo "average of H_bond: $hb_ave"

##sasa    将每一帧的界面面积结果输出到文件中
paste SA-N_teminal.dat SA-C_teminal.dat SA-complex.dat | grep -ve '-1.0000' | awk '{print $1,($2+$4-$6)/2}' >contact_area.dat
#使用NR>1来忽略第一行,然后对第二列求和。在END块中,如果总行数>1,则计算平均值并输出。
average=$(awk 'NR > 1 {sum += $2} END {if (NR > 1) print sum / (NR - 1)}' "contact_area.dat")
echo "average of SASA: $average"

(1)#取出log文件中带有“Value”的第二个匹配行
for ff in `ls *log`;do sed -n '/Value/p' $ff | sed -n 2p >> s2s2.dat;done

(2)#取出log文件中带有“Value”的第二个匹配行的第九列
for ff in `ls *log`;do sed -n '/Value/p' $ff | sed -n 1p | awk '{print $9}'>> s1s1.dat;done

(3)#将每一行的数字除以18然后输出到新文件中去
for line in `cat 330_bcl850.dat`;do echo "scale=5;$line/18"| bc >> 330bcl850.dat;done

(4)#将文件夹bcl_addh_gjf中的000.gjf 001.gjf...文件移动到frame0 1 2 ...9文件夹下
for i in 0 1 2 3 4 5 6 7 8 9;do mkdir frame$i;done
for i in 0 1 2 3 4 5 6 7 8 9;do mv bcl_addh_gjf/*"00$i"* frame$i;done

(5)#输出文件夹frame8中所有文件的相对路径,\为转义符
find frame8/* | sed 's/^/.\//' > 888.txt

(6)#将gjf文件转换成xyz文件
for i in `ls *dat`;
 do
     aa=`echo $i | sed 's/\.dat//g'`
     echo $aa
     wc -l $i | awk {'print $1 - 11'} > $aa.xyz;echo '' >>$aa.xyz
     head -n -3 $i | tail -n +9 >> $aa.xyz
     done
(7)#一列数求和,取平均,取极值等
cat r_270.dat | awk '{sum+=$1} END {print "average=",sum/NR}'     #sum
cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'     #average
cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'   #max
cat data|awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'    #min
cat rmsd_average.dat | awk '{print $2}' | awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'   #min 第二列
awk '{x[NR]=$0; s+=$0; n++} END{a=s/n; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/n); print "SD = "sd}' angle_sdt.dat  #求一列数的标准差

  (8)第二列去重

cat dis.dat | awk '!a[$2]++{print}' | awk '{print $2}'

 

4,、shell中的引号

单引号表示完全不希望处理引起来的字符,就是字符串

双引号与单引号一样,但是双引号会确切地处理引起来的文字中的转移字符、算术、命令替换等。

 

3,求一列数的标准差

awk '{x[NR]=$0; s+=$0; n++} END{a=s/n; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/n); print "SD = "sd}' angle_sdt.dat

 

2,每隔50行取一下平均(作图用)

    awk '{SUM+=$1}NR%50==0{print SUM/50;SUM=0}END {if (NR%50) {print SUM/(NR%50)}}' angle_cpp.agr > angle.dat

 

1,文件去重,删除相同的行

(1)sort -u file3   或者   sort file3 | uniq     #先排序再去重

(2)awk ' !x[$0]++' file3   #直接去重

posted on 2020-08-13 10:52  计算之道  阅读(187)  评论(0编辑  收藏  举报