到目前为止,我有一个很长的脚本,并且无法真正设法让这一个awk命令工作。我有这个for循环:
echo "$numberoflipids" # 1
for (( i=0 ; i<$numberoflipids ; i++ ))
do
echo "${nol[$i]}" # POPC
echo "$pr" # 5
awk -v lipid="${nol[$i]}" threshold="$pr" '$4~/lipid/&&$NF>threshold{print >"filec";next}{print > "tmp"}' filea && mv tmp fileb
## Also tried this:
# awk '$4~/"'${nol[$i]}'"/&&$NF>"'$pr'"{print >"patch_rmlipids.pdb";next}{print > "tmp"}' bilayer_CG_ordered.pdb && mv tmp patch.pdb
## And this works... (giving the exact values)
# awk '$4~/"POPC"/&&$NF>5{print >"patch_rmlipids.pdb";next}{print > "tmp"}' bilayer_CG_ordered.pdb && mv tmp patch.pdb
done
第三个awk命令对我来说非常合适...它在filea
的第4列中搜索POPC,将最后一列中超过5的行复制到filec
并复制剩余的行到fileb
。
我希望你们中的一个找到时间阅读代码,并且可能会给我一些建议,告诉我这些变量没有给awk。
PS:我的文件看起来像这样:
ATOM 624 SC1 SER 288 54.730 23.870 56.950 1.00 0.00
ATOM 3199 NC3 POP 487 50.780 27.750 27.500 1.00 3.18
ATOM 3910 C2B POP 541 96.340 99.070 39.500 1.00 7.00
ATOM 4125 W PW 559 55.550 64.300 16.880 1.00 0.00
(关于awk命令的老帖子:bash - check for word in specific column, check value in other column of this line, cut and paste the line to new text file)
答案 0 :(得分:2)
您需要从/
左右移除lipid
- 在您与文字模式/lipid/
匹配时,而不是变量的内容。
变化:
$4~/lipid/
为:
$4~lipid
答案 1 :(得分:0)
而不是~
运算符(/.../
需要文字正则表达式;您不能在其中使用变量),请使用match
函数。
awk -v lipid="${nol[$i]}" threshold="$pr" \
'match($4, lipid) && $NF > threshold {print >"file";next}{print > "tmp"}' filea &&
mv tmp fileb