繁体   English   中英

删除特定字符后的行 | awk

[英]delete rows after specific character | awk

我正在编写一个 Bash 脚本,我需要删除 TER 之间的所有行,包括 'TER's

输入文件 :

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H  
TER
ATOM      1 HO5'   A     1       3.429  -7.861   3.641  1.00  0.00           H  
ATOM      2  O5'   A     1       4.232  -7.360   3.480  1.00  0.00           O  
ATOM      3  C5'   A     1       5.480  -8.064   3.350  1.00  0.00           C  
ATOM      4  H5'   A     1       5.429  -8.766   2.518  1.00  0.00           H  
TER

预期输出:

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H  

我发现

sed '/TER/,$d' ${myArray[j]}.txt >> ${MyArray[j]}.txt  ### ${MyArray[j]} file name through an array 

但这不起作用,我认为 awk 可以与 Bash Script 一起使用。 帮助 谢谢

您可以像这样使用sed

sed -i.bak '/^TER/,/^TER/d' "${myArray[j]}.txt"
cat "${myArray[j]}.txt"

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H

可以这样做

sed '/TER/,$d' ${myArray[j]}.txt > tmp.txt #note only one " > "
mv tmp.txt ${myArray[j]}.txt
sed '/TER/,/TER/d' 
   echo 
   "ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
    ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H  
    TER
    ATOM      1 HO5'   A     1       3.429  -7.861   3.641  1.00  0.00           H  
    ATOM      2  O5'   A     1       4.232  -7.360   3.480  1.00  0.00           O  
    ATOM      3  C5'   A     1       5.480  -8.064   3.350  1.00  0.00           C  
    ATOM      4  H5'   A     1       5.429  -8.766   2.518  1.00  0.00           H  
    TER"  |sed '/TER/,/TER/d' 


######################################################################################

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H 

sed '/Start Pattern/,/End Pattern/d'

awk还提供了一个使用标志来控制打印的简单解决方案。 下面的skip变量用作标志。 如果1行被跳过,在从10的转换中,脚本退出。

awk -v skip=0 '$1=="TER"{skip=skip?1:0; if (!skip)exit}1' file

以上$1=="TER"用于匹配第一个字段为TER行(记录)(这可以消除"TER""TERMINAL"等之间的歧义...)在规则中,三元skip=skip?1:0在第一次遇到"TER"时设置skip=1 ,在下一次设置为0 如果skip==0脚本退出。 最后的1只是print简写。

示例使用/输出

使用file的数据,您将获得:

$ awk -v skip=0 '$1=="TER"{skip=skip?1:0; if (!skip)exit}1' file
ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM