如何使用sed或awk删除在特定位置包含特定字符串的行



我想查找并删除在特定位置具有特定长度的特定字符串的所有行。

我的数据集中有一行看起来像这样:

STRING   1234567 1234567 7654321 6543217 5432176

注:

  • 条目的字段宽度为8

  • 识别号可以在同一行中重复

  • 识别号可以在不同的线路上重复,但在不同的位置-这些线路不应删除

在这个例子中,我想找到位于第17列并跨越到第24列(即第三个字段(的包含"1234567"的行,并将它们删除。如何使用sed或awk?

我使用了以下内容,但它删除了我想保留的行:

sed -i '/1234567/d' ./file_name.dat

干杯!

您可以使用

sed -i '/^.{17}1234567/d' ./file_name.dat

详细信息

  • ^-行的开头
  • .{17}-任意17个字符
  • 1234567-一个子字符串

查看在线sed演示:

s="STRING   1234567 1234567 7654321 6543217 5432176
STRING   1234567 5534567 7654321 6543217 5432176"
sed '/^.{17}1234567/d' <<< "$s"
# => STRING   1234567 5534567 7654321 6543217 5432176

使用awk,打印除子字符串匹配之外的行。

$ awk 'substr($0,17,7)=="1234567"{next}1' file > output_file

或者反逻辑更容易

$ awk 'substr($0,17,7)!="1234567"' file > output_file

最新更新