【问题标题】:Extract substring from rows with regex and remove rows with duplicate substring使用正则表达式从行中提取子字符串并删除具有重复子字符串的行
【发布时间】:2012-11-15 19:06:15
【问题描述】:

我有一个文本文件,其中一些行格式如下

*,[anything, even blanks],[dog|log|frog],[dog|log|frog],[0|1],[0|1],[0|1]

我想删除与* 具有相同值的重复行(不区分大小写),即,[anything, even blanks],[dog|log|frog],[dog|log|frog],[0|1],[0|1],[0|1] 剩下的任何内容

例如这里是一个示例文本文件

test,bar,log,dog,0,0,0
one
foo,bar,log,dog,0,0,0
/^test$/,bar,log,dog,0,0,0
one
FOO,,frog,frog,1,1,1

生成的文本文件应该删除重复的 foo(顺序对我来说并不重要,只要删除重复项,留下 1 个唯一)

test,bar,log,dog,0,0,0
one
/^test$/,bar,log,dog,0,0,0
one
FOO,,frog,frog,1,1,1

我能做的最简单的 bash 命令是什么?

【问题讨论】:

    标签: regex linux bash sed awk


    【解决方案1】:
    awk -F, '!seen[tolower($1)]++' file
    

    【讨论】:

      【解决方案2】:

      您可以像这样使用awk 执行此操作(因为您不在乎保留哪些重复项):

      awk -F, '{lines[tolower($1)]=$0}END{for (l in lines) print lines[l]}'
      

      如果您想保留第一个:

      awk -F, '{if (lines[tolower($1)]!=1) { print; lines[tolower($1)]=1 } }'
      

      【讨论】:

      • 我认为你需要像这样修复:{ print;行[tolower($1)]=1 }
      • @maverick 哎呀......错过了那个。固定。
      【解决方案3】:

      搜索

      (?:(?<=\n)|^)(.*)((?:,(?:d|l|fr)og){2}(?:,[01]){3})(?=\n)([\s\S]*)(?<=\n).*\2(?:\n|$)
      

      ...并替换为

      $1$2$3
      

      【讨论】:

      • 那么我从 cli 运行的确切命令是什么,将文本文件的路径作为参数传递?
      【解决方案4】:
      #!/bin/bash
      
      for line in $(cat $1)
      do
          key=$( echo ${line%%,*} | awk '{print tolower($0)}')
      
          found=0
          for k in ${keys[@]} ; do [[ "$k" == "$key" ]] && found=1 && break ; done
          (( found )) && continue
      
          echo $line
          keys=( "${keys[@]}" "$key" )
      done
      

      使用数组而不是关联(哈希),这会降低性能。但它似乎有效。

      【讨论】:

        【解决方案5】:

        这可能对你有用(GNU sed):

        cat -n file | 
        sort -fk2,2 |
        sed -r ':a;$!N;s/^.{7}([^,]*),[^,]*(,(d|l|fr)og){2}(,[01]){3}\n(.{7}\1,[^,]*(,(d|l|fr)og){2}(,[01]){3})$/\5/i;ta;P;D' |
        sort -n |
        sed -r 's/^.{7}//'
        
        1. 为每一行编号。
        2. 按第一个键排序(忽略大小写)
        3. 删除重复项(根据特定标准)
        4. 将缩小的文件重新排序为原始顺序
        5. 删除行号

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 2020-09-15
          • 2013-04-12
          • 1970-01-01
          相关资源
          最近更新 更多