我有一个重复行的文件。
FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID TargetAtomName NeighborAtomID NeighborAtomName BondLenght NeighborAtomID ...
FRAM_# 0 0(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.988
CN= 0 SBSDRYTGT 16652 O 16654 H 0.942 16653 H 0.988
CN= 1 SBSDRYTGT 16654 H 16652 O 0.942
FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID TargetAtomName NeighborAtomID NeighborAtomName BondLenght NeighborAtomID ...
FRAM_# 100 25(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.959
CN= 0 SBSDRYTGT 16652 O 16654 H 1.012 16653 H 0.959
CN= 1 SBSDRYTGT 16654 H 16652 O 1.012
FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID TargetAtomName NeighborAtomID NeighborAtomName BondLenght NeighborAtomID ...
FRAM_# 200 50(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.991
CN= 0 SBSDRYTGT 16652 O 16654 H 0.952 16653 H 0.991
......
我想使用变量删除那些重复的行
FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID TargetAtomName NeighborAtomID NeighborAtomName BondLenght NeighborAtomID ..
以下是我的命令:
key=`head -n 1 filename`;
sed -i "/$key/d" filename;
我希望得到如下结果
FRAM_# 0 0(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.988
CN= 0 SBSDRYTGT 16652 O 16654 H 0.942 16653 H 0.988
CN= 1 SBSDRYTGT 16654 H 16652 O 0.942
FRAM_# 100 25(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.959
CN= 0 SBSDRYTGT 16652 O 16654 H 1.012 16653 H 0.959
CN= 1 SBSDRYTGT 16654 H 16652 O 1.012
FRAM_# 200 50(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.991
CN= 0 SBSDRYTGT 16652 O 16654 H 0.952 16653 H 0.991
CN= 1 SBSDRYTGT 16654 H 16652 O 0.952
FRAM_# 300 75(fs) CN= 1 PRMRYTGT 16653 H 16652 O 0.952
CN= 0 SBSDRYTGT 16652 O 16654 H 0.987 16653 H 0.952
CN= 1 SBSDRYTGT 16654 H 16652 O 0.987
.......
但是,以上命令不起作用。如果我使用
sed -i '/FrameNO/d' filename;
我可以得到正确的结果。
我试图设置变量
keyword=FrameNO
,我无法获得正确的结果。
我可以知道使用变量时出了什么问题吗?我该如何解决?谢谢。
答案 0 :(得分:2)
该行包含[]
个字符,这些字符在正则表达式中具有特殊含义。您需要对其进行转义,以便从字面上进行匹配。
key=$(head -n 1 filename)
key=${key//\[/\\[}
key=${key//\]/\\]}
${variable//pattern/replacement}
将pattern
值中的通配符replacement
的所有匹配替换为$variable
。
但是可以使用sed
而不是使用grep -F
,它执行精确匹配而不是匹配正则表达式。然后,您无需进行上述替换。
grep -v -F "$key" filename > filename.new && mv filename.new filename