如何从列表中删除字谜重复项?

如何从列表中删除字谜重复项?

我有一个带有字符串和描述的制表符界定的 .csv。有点像这样:

strap   tight
elba    Island
foo     bar
able    Cain
parts   buy
able    Cain

首先,我按选项卡之前所有内容的长度对文件进行排序:

parts   buy
strap   tight
able    Cain
able    Cain
elba    Island
few     many

然后,我删除完全相同的重复项:

parts   buy
strap   tight
able    Cain
elba    Island
few     many

但是,我仍然需要删除字谜重复项 —部分带子有相同的字母。也如此厄尔巴岛有能力的

parts   buy
able    Cain
few     many

并回显对话框警告...类似:

发现骗子


关于如何最好地做到这一点有什么想法吗?

编辑:

下面的一些答案:

  • 这是针对 Mac 操作系统的
  • 我只关心 1 美元的匹配
  • $1 中不会有任何大写(但 $2 中会有)
  • $1中不会有重复的字母

这是我现在使用的代码:

  # print length+iii before every line
  awk '{printf "%diii%s\n", length($1), $0}' < file.txt > /tmp/out && mv /tmp/out file.txt

  # remove exact duplicates
  sort -u < file.txt > /tmp/out && mv /tmp/out file.txt

  # remove non-identical duplicates
  # awk '{magic}' < file.txt > /tmp/out && mv /tmp/out file.txt
  # varDupeEcho=remainder from above

  # sort by size
  sort -n -r -k1,1 < file.txt > /tmp/out && mv /tmp/out file.txt

  #remove lengths
  sed -i "" -E -e 's/^[0-9]+iii//' file.txt

  # warn about duplicates
  osascript -e "display dialog \"Duplicates found!\n\n$varDupeEcho\" --> Result: \{button returned:\"OK\"\}"

答案1

以任意顺序比较值的一般方法是对各部分进行排序以创建用于比较的键,例如使用 GNU awk 表示“sorted_in”,并使用 null 3rd arg 来 split() 将字符串拆分为字符:

$ cat tst.awk
BEGIN {
    PROCINFO["sorted_in"] = "@val_str_asc"
    OFS = "\t"
}
{
    key = ""
    split($1,chars,"")
    for (i in chars) {
        key = key tolower(chars[i])
    }
    print key, $0
}

$ awk -f tst.awk file | sort -k1,1 -u | cut -f2-
elba    Island
strap   tight
foo     bar

您可以一次一步地查看正在执行的操作,以便清楚地了解:

$ awk -f tst.awk file
aprst   strap   tight
abel    elba    Island
foo     foo     bar
abel    able    Cain
aprst   parts   buy
abel    able    Cain

$ awk -f tst.awk file | sort -k1,1
abel    able    Cain
abel    able    Cain
abel    elba    Island
aprst   parts   buy
aprst   strap   tight
foo     foo     bar

$ awk -f tst.awk file | sort -k1,1 -u
abel    elba    Island
aprst   strap   tight
foo     foo     bar

我看到您在问题中添加了一个声明,表明您使用的是 MacOS - 好的,只需在那里安装 GNU awk 即可。您可以使用其他 awks 执行上述操作,但需要生成一个 shell 来为每个输入行上的关键字符调用 Unix 排序,这将非常慢(并且编写起来有点麻烦)值,或者您必须实现自己编写一个排序算法,编写起来会很麻烦,而且当您可以快速轻松地安装 gawk 然后您就可以解决这个问题和未来的问题时,所有这些都不值得。

相关内容