リストからスペル置換の重複を削除するには?

リストからスペル置換の重複を削除するには?

文字列と説明を含むタブ区切りの.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 OS用です。
  • 私は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

任意の順序で値を比較する一般的な方法は、部分をソートして比較用のキーを作成することです。たとえば、 "sorted_in"にGNU awkを使用して文字列を文字に分割するには、nullの3番目の引数を使用します。

$ 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

明確な画像を得るために、一度に1つずつ実行されている作業を確認できます。

$ 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をインストールしてください。別のawkを使用して上記の操作を実行できますが、各入力行の主要文字に対してUnixソートを呼び出すためにシェルを作成する必要があります。これは値が非常に遅く、書き込みが少し面倒です。ソートアルゴリズムを直接実装する必要があり、作成するのが難しく、gawkをすばやく簡単にインストールでき、この問題と将来の問題を解決できる場合は、すべてが価値がありません。

関連情報