【问题标题】:Delete entire line if a specific word is longer than X characters, words in the row delimited by comma如果特定单词的长度超过 X 个字符,则删除整行,行中的单词由逗号分隔
【发布时间】:2019-04-17 02:02:23
【问题描述】:

我有一个超过 1000000 行的 .sql 文件。 我需要删除第三个“列”上包含超过 X 个字符的行(列以逗号分隔)

我尝试使用一些 VI、SED 和 AWK。 还有记事本++,但没有成功

(255500, 0, '0093', 0.4350, 0.4350 ) - Keep this
(255501, 0, '0035521160', 0.4350, 0.4350 ) < - Delete this

以逗号分隔的第三列中包含少于 8 个字符的单词我想保留该行,超过 8 个的单词我需要删除整行。

我尝试手动删除,但行数太多

【问题讨论】:

  • 你的文件真的是这样吗?请编辑您的问题以显示您的文件的外观
  • 如果您展示到目前为止您尝试过的代码(无论多么不足),并描述您遇到的问题,您将在这里得到更友好的接待和更好的帮助。如果没有代码,您的问题看起来像是请求免费咨询,很多人不喜欢这样。
  • 您提到@Raul Chiarella 您尝试了一些事情,我们总是鼓励人们在他们的帖子中发布他们的努力,所以请添加他们(以及回答用户在 cmets 中提出的问题)并让我们那就知道了。
  • awk -F'[ ,]+' '(length($3)-2)&lt;8' filename 可能是您正在寻找的。但是您的输入文件实际上似乎并不遵循某种模式。例如,左括号和第一个字段之间没有分隔符,但在最后一个字段和右括号之间有一个分隔符。
  • 这看起来像是 SQL INSERT 语句的一部分,所以对于那些询问“是的,这可能就是它的样子”的人来说。字符串将用单引号封装。劳尔,这应该只适用于以括号(或任何其他规则)开头的行吗?否则,您能否将所有这些插入到另一个表中,然后过滤掉?当然这样会更合理。

标签: awk sed notepad++


【解决方案1】:

如果这不是您所需要的全部,请编辑您的问题以阐明您的要求并提供更具代表性的示例输入/输出:

$ awk -F, 'length($3)<8' file
(255500, 0, '0093', 0.4350, 0.4350 ) - Keep this

【讨论】:

    【解决方案2】:

    如果您的数据在 'd' 文件中,请尝试 gnu sed:

    sed -E '/^[^,]+,[^,]+,\s*[^,]{9,}/d' d
    

    添加 -i 选项以真正编辑它; sed -Ei...

    【讨论】:

      【解决方案3】:

      试试这个:

      搜索:^[^,]+,[^,]+,\s*'[^']{8,}'.*\R?

      替换为:(nothing)

      即使在列数据之间添加空格,它也应该可以工作:

      (255501, 0,          '12345678', 0.4350, 0.4350 )
      

      你有一个演示 here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        • 1970-01-01
        相关资源
        最近更新 更多