リスト内の他の文字列の部分文字列のリスト

リスト内の他の文字列の部分文字列のリスト

次の名前のリストがあります。

dog_bone
dog_collar
dragon
cool_dragon
lion
lion_trainer
dog

次のように、別の名前の中に表示される名前を抽出する必要があります。

dragon
lion
dog

マニュアルページを見ましたが、uniq文字列ではなく行全体を比較しているようです。 bash関数を使用してこれを行う方法はありますか?

ベストアンサー1

file=/the/file.txt
while IFS= read -r string; do
  grep -Fe "$string" < "$file" | grep -qvxFe "$string" &&
    printf '%s\n' "$string"
done < "$file"

ファイルの各行は1つ、2つ、readまたはgrep時には1つのprintfコマンドを実行するため、それほど効率的ではありません。

ワンコールですべてを行うことができますawk

awk '{l[NR]=$0}
     END {
       for (i=1; i<=NR; i++)
         for (j=1; j<=NR; j++)
           if (j!=i && index(l[j], l[i])) {
             print l[i]
             break
           }
     }' < "$file"

ただし、これはファイル全体がメモリに保存されることを意味します。

おすすめ記事