【问题标题】:Remove duplicate string key in a text using command line使用命令行删除文本中的重复字符串键
【发布时间】:2013-03-06 14:17:34
【问题描述】:

我试图逐行删除一些重复的字符串。例如:

A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
A {id: "y" p {id: "wse" v: "i4"} on:ue"}
A {id: "z" p {id: "das" v: "i4"} on:tade"}
A {id: "x" p {id: "da" v: "i4"} on:faer"}
A {id: "y" p {id: "werw" v: "i4"} on:asee"}
A {id: "y" p {id: "werw" v: "i4"} on:asee"}

输出应该是没有重复A_id的,这意味着输出应该是:

A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
A {id: "y" p {id: "wse" v: "i4"} on:ue"}
A {id: "z" p {id: "das" v: "i4"} on:tade"}

我遇到的问题是我不知道如何排序并仅使用子字符串使其唯一。 我尝试使用:

cat input.txt | grep 'A\s\{id:\s\"[^;]*\sp\s\{id:' | sort -u > output.txt

但它不会删除重复的子字符串,而只会删除与其他字符串完全相同的行。所以它就像它只是被删除:

A {id: "y" p {id: "werw" v: "i4"} on:asee"}

与最后两行相同,但没有删除:

A {id: "y" p {id: "wse" v: "i4"} on:ue"}

id 重复但内容不同。

【问题讨论】:

    标签: regex command-line duplicates unique


    【解决方案1】:

    一个 awk 解决方案:

    $ awk '!a[$3]++' file
    A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
    A {id: "y" p {id: "wse" v: "i4"} on:ue"}
    A {id: "z" p {id: "das" v: "i4"} on:tade"}
    

    结合 grep 命令的匹配项:

    $ awk '$1=="A" && $2=="{id:" && $4=="p" && $5=="{id:" && !a[$3]++' file
    A {id: "x" p {id: "vcv" v: "i4"} on:taf"}
    A {id: "y" p {id: "wse" v: "i4"} on:ue"}
    A {id: "z" p {id: "das" v: "i4"} on:tade"}
    

    【讨论】:

      【解决方案2】:

      问题是sort默认使用整个字符串作为key,所以它只会删除相同的行。

      尝试改变

      sort -u
      

      sort -uk3,3
      

      消除键是第三个字段的重复项。字段由空格分隔。

      -k, --key=POS1[,POS2] 在 POS1 开始一个键,在 POS2 结束它(原点 1)

      POS 是 F[.C][OPTS],其中 F 是字段编号,C 是 字段中的字符位置。 OPTS 是一个或多个 单字母排序选项,覆盖全局排序 该键的选项。如果没有给出键,则使用整行作为 钥匙。

      Reference.

      【讨论】:

      • 我使用了这样的命令 :cat ~/lexicon.clex | sort -u -k 1 20 > ~/output.clex,但它说“排序:打开失败:20:没有这样的文件或目录”
      • @QingshanZhang 我认为这是我这边的语法错误,请尝试在110 之间添加一个逗号,请参阅编辑。
      • @Dukeling 语法错误是由缺少逗号引起的,这不能满足 OP 的需要。
      • ye 现在可以工作但没有删除重复的子字符串,带有 awk 的工作!但是还是非常感谢您的帮助!不知道谁对此投了反对票,但我投票是为了平衡它。:)
      • @sudo_O 我没有看到问题(不是我有一台 Linux 机器可以测试它),除了 grep 的结果可能包括格式以外的结果(我认为从那个正则表达式中很有可能)。
      【解决方案3】:

      Perl 解决方案:

      perl -ne 'if (/\{id: "([^"]+)"/ and not exists $h{$1}) { $h{$1}++; print }'
      

      它将匹配的 id 存储在哈希中,并且仅在 id 尚未在哈希中时打印。

      【讨论】:

      • 对不起,我也不熟悉 perl,但感谢您的帮助:)
      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2016-07-13
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多