5、一些短脚本
(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 #直接去重