【问题标题】:Removing duplicate entries from files on the basis of substring postfixes根据子字符串后缀从文件中删除重复条目
【发布时间】:2014-02-18 20:38:17
【问题描述】:

假设我在文件中有以下文本:

foo.bar.baz
bar.baz
123.foo.bar.baz
pqr.abc.def
xyz.abc.def
abc.def.ghi.jkl
def.ghi.jkl

如何根据后缀从文件中删除重复项?没有重复的预期输出将是:

bar.baz
pqr.abc.def
xyz.abc.def
def.ghi.jkl

(考虑foo.bar.bazbar.baz。后者是子字符串后缀,因此仅保留bar.baz。但是,pqr.abc.defxyz.abc.def 都不是彼此的子字符串后缀,因此两者都保留。)

【问题讨论】:

  • 你能更准确一点吗?我不明白这里的模式。
  • @dstronczak,我试图解释得更好一些,也许现在这会有意义。

标签: bash shell


【解决方案1】:

试试这个:

#!/bin/bash

INPUT_FILE="$1"

in="$(cat $INPUT_FILE)"
out="$in"

for line in $in; do
  out=$(echo "$out" | grep -v "\.$line\$")
done

echo "$out"

您需要将其保存到脚本(例如bashor.sh),使其可执行(chmod +x bashor.sh)并使用您的输入文件作为第一个参数调用它:

./bashor.sh path/to/input.txt

【讨论】:

  • 我想出了一个类似的解决方案。但是您有一个错误:grep 会将. 解释为任何字符,因此您必须对其进行转义:裸.$line 中的点(也就是说,假设没有其他特殊字符和前缀总是用点分隔)
  • 实际上,如果只有三个字符的标记,我的解决方案就可以了(我故意使用了. 一个通配符)。但当然这是一个疯狂的假设,所以我在问题中逃避了....
  • 是的,这是一个疯狂的假设。如果不是,a.a 将匹配 aaa。我更担心逃跑...
【解决方案2】:

使用sed 转义正则表达式的字符串,前缀.,后缀$ 并将其通过管道传输到GNU grep(-f - 不适用于BSD grep,例如在mac 上)。

sed 's/[^-A-Za-z0-9_]/\\&/g; s/^/./; s/$/$/' test.txt |grep -vf - test.txt

我只是习惯了regular expression escaping from another answer,并没有考虑是否合理。乍一看,它似乎很好,但逃脱了太多,尽管这可能不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2014-06-19
    • 2020-06-03
    • 1970-01-01
    • 2013-06-19
    • 2018-02-20
    • 2016-11-17
    相关资源
    最近更新 更多