【问题标题】:How do I delete a line that contains a specific string at a specific location using sed or awk?如何使用 sed 或 awk 在特定位置删除包含特定字符串的行?
【发布时间】:2018-11-14 16:15:22
【问题描述】:

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

我的数据集中的一行如下所示:

STRING   1234567 1234567 7654321 6543217 5432176

注意事项:

  • 条目的字段宽度为 8

  • 标识号可以在同一行重复

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

在此示例中,我想在第 17 列找到包含“1234567”并跨越到第 24 列(即第三个字段)的行并将它们删除。如何使用 sed 或 awk 做到这一点?

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

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

干杯!

【问题讨论】:

    标签: awk sed command


    【解决方案1】:

    你可以使用

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

    详情

    • ^ - 行首
    • .{17} - 任意 17 个字符
    • 1234567 - 一个子字符串。

    online sed demo

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

    【讨论】:

    • Op 想要 s 而不是 d
    • @Kent 请参阅“我想在特定位置查找并删除所有具有特定字符串、特定长度的行。”。让 OP 决定哪种解决方案最有效
    • 我读过I have used the following, but it deletes lines that I want to keep: ... :D 也许你是对的,他可能是指其他地方的比赛。
    【解决方案2】:

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

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

    或许逆向逻辑更容易

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

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2011-02-25
      相关资源
      最近更新 更多