一、sed
参考:http://blog.csdn.net/engledb/article/details/19623087
sed 简介
sed逐行处理文件过程:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示,处理完输入文件的最后一行后,sed便结束运行。
sed正则表达式
sed使用的正则表达式是括在斜杠线"/"之间的模式
cat r+bdna.lis | sed -n '/^ (E)/,/^ 20.5/p' > 1
抽提以" (E)"开头到以" 20.5"开头的行的内容,-n 取消默认打印,p 显示模式空间的内容,-n与p同时出现代表只打印模式空间中已匹配的内容。
sed '/^test/a\this is a test line' file
行后追加:将 this is a test line 追加到 以test 开头的行后面,详见参考。
二、AWK
参考http://blog.csdn.net/andyxm/article/details/5964071
awk简介
awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理
awk '{print "a"}'/etc/passwd(输出文件中相同行数的a,更是证明了awk是逐行处理的)
语法
awk '{pattern + action}' {filenames}awk 'pattern' filename
awk '{action}' filename
awk 'pattern {action}' filename( 参考:http://www.cnblogs.com/mchina/archive/2012/06/30/2571308.html)
man awk : 部分如下
Statements are terminated by newlines,semi-colonsor both. Groups of statements such asactions or loop bodiesare blocked via{ ... } as in C. The last statement in a block doesn't need a terminator. Blank lines have no meaning; an empty statement is terminated with a semi-colon. Long statements can be continued with a backslash, \. A statement can be broken without a backslash after a comma, left brace, &&, ||, do, else, the right parenthesis of an if, while or for statement, and the right parenthesis of a function definition. A comment starts with # and extends to, but does not include the end of line.
举例
awk '$1=="ATOM" || $1=="HETATM" || $1=="TER" || $1=="END"' 1D23.pdb > 1D23_clean.pdb
awk '$1=="END" ; {print}'1D23.pdb > 1D23_clean.pdb--> 输出1D23.pdb之所有。这是分号(;semi-colons)所起到的分割作用。两个例子均默认以原格式输出。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三、sort 命令
来自: http://man.linuxde.net/sort
sort -u sort.txt
sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出,(-u 忽略相同行,可以去重复)
sort -n -k1 g9.dat > sort.dat
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
awk:pattern中的比较与匹配: ==,!= 与 ~,!~
用awk去除相邻两行的重复值,与sort联用可去重。
>awk '$1==a {} $1!=a{a=$1;print $1}' 346bdg.dat
只改变第一列的格式或值,第二列保持不变
>awk '$1==$1{printf "%.0f\t", $1} $2==$2{print $2}' bbmg.dat >2
>awk '{$1=($1-1)*0.5}{print $1"\t"$2 }' 1.dat
用awk匹配第一列和第三列只有一列以D开头的行
>cat UU.dat |awk ' $1!~/^D/&& $3~/^D/ ||$1~/^D/&&$3!~/^D/ {print $0 > "r.dat"}'
或cat UU.dat |awk '{if($1!~/^D/&& $3~/^D/||$1~/^D/&&$3!~/^D/) print $0 > "r1.dat"}'
>cat r114.dat |awk '$1!~"@H"&&$1!~"@C"&&$3!~"@C" {print $0 > "r114-2.dat"}'
awk不抽提第2,3列
>awk '{$2=$3="";print}' gr2.dat > gr3.dat。semi-colons分割action。
awk匹配每行单个域内2位及2位以上的数字
>awk '/[0-9][0-9]+/' 1.dat
123 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
四、shell——if
>cat DG.dat |awk '{if($2==0) $2="" ;if($2==1) $2="-_@NH";print $0 > "DG12.dat"}'
awk中if后紧跟的print前不用加;?????????????当$2的第一行的值为零时,第一行总是输不出来,原因???
>awk '$1=$1*5*10^-3 {print}' watshellhb.dat > watshellhb-ns.dat
>grep '^ENE:' ../mg.log |awk '$2=$2*10^-6 {if((NR%5==0)) print $2"\t"$7 > "e1.dat"}'
>cat bd.dat |while read line ;do var=${line#*,};var1=${var%f*} ;if(($var1>=2400));then echo $line >> "1";fi;done
-bash: ((: #Bridging Solute Residues:>=2400: syntax error: operand expected (error token is "#Bridging Solute Residues:>=2400")????????????
五、shell——截取字符串
截取每行从左边起第一个逗号往右,以及右边起f往左的内容
cat bd.dat|grep "6:L"|while read line ;do var=${line#*,};echo $var" "${var%f*} >> mg.dat;done
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>cat -n hbondsmg.dat | awk '{FS=" "} {print $1"\t"$3 > "hbondsmg2.dat"}'
-n: print number of row
把文件里第2,4列相加为一列
>cat 33.dat |awk '{printFNR"\t"$2+$4 > "44.dat"}'
改变输出域分隔符(OFS)
>awk 'BEGIN{OFS=" "; print "No. W12,W21" > "t8sort1.dat"}{print $1,$5,$6 >> "t8sort1.dat"}' t8sort.dat (得加分号)
>awk 'BEGIN{OFS=" "} {print "No. W12,W21" > "t8sort1.dat"}{print $1,$5,$6 >> "t8sort1.dat"}' t8sort.dat (没有分号,每行都有No. W12,W21)
awk抽提第10至第15行
>awk 'NR>=10 && NR<=15' (只有pattern,默认会action{print})
awk每隔5行抽提
>awk 'NR%5==0' elec-100-150.dat >e.dat
替换文件某列的值
>awk '$4="XXX"' 0E8_clean_H.pdb > XXX.pdb
man awk——Builtin-variables
NR: current record number in thetotal input stream
FNR: current record number in FILENAME.一行一个record.
NF: number of fields in the current record.
FS: splits records into fields as a regular expression.
OFS: inserted between fields on output, initially = " ".
RS: input record separator, initially = "\n"
ORS: terminates each record on output, initially = "\n".
##################################
BEGIN/END
参考http://151wqooo.blog.51cto.com/2610898/1309851
BEGIN模块后紧跟着的动作块在awk处理任何输入文件之前执行,所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。而END之后列出的操作将在扫描完全部的输入之后执行。
##################################
AWK——变量
比较下面两个:
>cat 1
123 1
345 2
456 3
>awk 'BEGIN {print "title";totel=0}{print $1;print totel;totel=totel+$1;print totel}END{print totel}' 1
title
123
0
123
345
123
468
456
468
924
924
>awk 'BEGIN {print "title";totle=0}{print $1;print$totle;$totle=$totle+$1;print$totle}END{print$totle}' 1
title
123
123 1
246
345
345 2
690
456
456 3
912
912
总结:awk中可以自定义变量,直接为一个变量赋值就定义了一个变量,比如totel=0。事实上第一次使用变量即可自定义变量,默认值为0,如下所示sum。
awk中变量定义和C是一样的,定义和使用时都不需要加$之类的操作符
(参考http://blog.chinaunix.net/uid-631921-id-2083479.html)
awk中shell传给命令行的变量,需要使用$,''内的代码属于awk来解析的,定义和使用时都不需要使用$。
(参考http://blog.chinaunix.net/uid-631921-id-2083479.html)
自定义变量(参考http://www.jianshu.com/p/ea22c809ae9f)
1.在选项位置定义: -v var=VALUE
2.在program中定义: awk 'BEGIN{test="hello";print test}',变量在program中定义时,需要使用引号。
或awk '$1="XXX"' 1.dat
事实上对某列求和:
>awk '{print sum+=$1}' 1
#############################################
awk中使用shell 变量
(参考https://zhidao.baidu.com/question/745252363876135132.html)
>var=a
>awk -v m=$var 'BEGIN {print m}'
a(???????)
awk中shell传给命令行的变量,需要使用$,''内的代码属于awk来解析的,定义和使用时都不需要使用$。
>var="test"
>awk 'BEGIN {print "$var"}'
$var(双引号不是应该能解释$吗????照理应该输出test啊??)
>awk 'BEGIN {print"'$var'"}'
test
>var="a test"
>awk -v m="$var" 'BEGIN {print m}'
a test
>awk -v m=$var 'BEGIN {print m}'
awk: cannot open BEGIN {print m} (No such file or directory)
???????????????????
>var="this is a test"
>awk 'BEGIN{print"'"$var"'"}'
this is a test
如果var中含空格,为了shell不把空格作为分隔符,便应该如上使用。六、shell——单引号和双引号
双引号:只解释(`(命令替换),$(变量替换),\),其余直接输出。
单引号:全部不解释,直接输出。
shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。(注意是所有,只是单引号本身不能够出现在其中)。(参考http://blog.csdn.net/luo6620378xu/article/details/9081417)
#################################
awk匹配对象是一个变量
>v=root
>awk '/'$v'/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
类似于grep "root" /etc/passwd
抽取第一列为>的行
>awk '{if($1==">")print $0 > "tleap.in"}' leap.log
七、grep
grep精确匹配
grep -w "MODEL $i" -A 94928 ../1dh3.pdb > grep$i.pdb
grep 删除匹配行
grep -vn 'ide-C' > nodna-c-wat.log
-vn : 除了匹配的打印出来,有行号。
grep -o ",338(" bd.dat >& nmbd.dat把文件中所有的,338(抽提出来,并按行列出。
wc -l nmbd.dat计算行数。
八、简单的shell脚本
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
print >>fp,"#!/bin/sh"+'\n'
print >>fp,"export CUDA_VISIBLE_DEVICES=0,1"
for i in range(40):
line = 'mpirun -n 2 pmemd.cuda.MPI -O -i prod.in -o '+' '+str(i+1)+'prod.out -p '+' '+'2pep'+str(i+1)+'-wat.prmtop'+' '#####可以循环迭代400个命令。###
fp.write(line)
fp.close
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
用curves+计算轨迹pdb中的每帧核酸的结构参数
for((i=1;i<5001;i=i+5))
do
grep -w "MODEL $i" -A 4000 ./1dh3-mg-75-100ns.pdb > grep$i.pdb
mkdir grep$i
cp curves ./grep$i
mv grep$i.pdb ./grep$i
cd grep$i
mv grep$i.pdb 1dh3-mg-75-100ns.pdb
. curves
cd ..
done
#########################
九、shell 函数
自定义回收站功能
(参考http://www.jb51.net/LINUXjishu/151035.html
http://blog.csdn.net/ljianhui/article/details/9333443)
命令:
myrm(){ D=~/.local/share/Trash/files/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; }
alias rm='myrm'(取消alias : unalias rm)命令:
参考 https://zhidao.baidu.com/question/646925076041959165.html
>mkdir /tmp/trash_tmp
>vi /bin/trash
mv $@ /tmp/trash_tmp
>vi /etc/bashrc ???????????不知道可否用~/.bashrc??????
(/etc/bashrc 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取)
在最后一行添加alias rm=/bin/trash?????????????
>chmod 755 /bin/trash
>chmod 777 /tmp/trash_tmp
>source /etc/bashrc
如果要真的删除某个文件的时候用 /bin/rm -i file_name