次の名前のリストがあります。
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"
ただし、これはファイル全体がメモリに保存されることを意味します。