Bash 删除特定字符| awk后的行
我正在写一个Bash脚本, 我需要删除TER之间的所有行,包括“TER” 输入文件: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 -
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