Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 删除特定字符| awk后的行_Bash_Unix_Awk_Sed - Fatal编程技术网

Bash 删除特定字符| awk后的行

Bash 删除特定字符| awk后的行,bash,unix,awk,sed,Bash,Unix,Awk,Sed,我正在写一个Bash脚本, 我需要删除TER之间的所有行,包括“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 TER ATOM 1 HO5' A 1 3.429 -

我正在写一个Bash脚本, 我需要删除TER之间的所有行,包括“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  
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脚本一起工作。帮助谢谢

您可以这样使用sed:

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

可以这样做

sed '/TER/,$d' ${myArray[j]}.txt > tmp.txt #note only one " > "
mv tmp.txt ${myArray[j]}.txt
awk还提供了一个使用标志控制打印的简单解决方案。下面的skip变量用作标志。如果跳过1行,则在从1到0的转换过程中,脚本将退出

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,在下一次遇到TER时设置skip=0。如果skip==0,则脚本退出。最后的1只是印刷品的简写

示例使用/输出

使用文件中的数据,您将获得:

$ 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

您期望的输出是什么?相同的文件不更改附加到您正在读取的相同文件不是最好的主意。expeced output是前两行,三行之间没有行。。。。。。tersed脚本“/TER/,$d本身生成正确的输出,即使它也会删除第二个TER后面的行。但正如@Shawn所建议的,原始命令中的问题是另一个。最好锚定为sed'/^\s*TER$/,/^\s*TER$/d',以要求TER作为第一个非空白字,并从终端消除歧义,等等。。
   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 -v skip=0 '$1=="TER"{skip=skip?1:0; if (!skip)exit}1' 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