文字列のリストを取得し、リストのどこかに部分文字列を持たないものだけを残したいとします。私は他の場所で、リスト内の任意の部分文字列を持っていない文字列のリストにそれを減らしたいLinux:文字列のリストをリスト内の他の場所に持っていればリストから文字列を削除してください
apple
applesauce
kiwi
mango
mangoes
mangosteen
oranges
pineapples
:説明するために、私はこのリストを持っています。だから、結果のリストは次のようになります。apple
は別の場所リストであり、両方のそれらの単語の部分文字列であるため、削除された
apple
kiwi
mango
oranges
注applesauce
こととpineapples
。
私は同様の質問を見つけたhereですが、具体的に接頭語、 ablaze, able, abler, ablest
。その方法に基づいて、私は私のリストの事前ソートコピーと、次を試してみましたが、それだけでも、私はそれが思ったapplesauce
削除せずに、リスト全体を印刷:
awk '$1~r && p in k { next } { k[$1]++; print; r= "^" $1; p=$1 }' fruitsorted.txt
それは私のように働いていた場合でもを予想通り、それでも私のリストにはpineapple
がありません。
極端なケースでは、アルファベット(または私が推測するASCII文字セット)のすべての文字が別々の行に含まれていれば、そのリストにあったものに関係なく、出力はちょうどアルファベット/文字セット。
また、私の開始リストはソートされていません。結果リストがソートされているかどうかは本当に気にしませんが、それは明らかにsort
で簡単です。
理想的には、より長い形式のPerl/Python /私がすでに実装する方法を知っているスクリプトとは対照的に、grep/sort/awkのようなコンパクトなシェルコマンド/シーケンスが理想的です。
ありがとうございました。
更新
としても、かもしれ台無しにいくつかの基本的なアプローチ、例えば、リストを並べ替え、下記のエド・モートンが指摘しました次の例では、並べ替えられたリストがの後に来るので、おそらくberryplum
を削除できないと仮定しているアプローチです。 123で示される第2のアプローチは、このケースを扱う。リストがソートされている場合の要素がラインに存在する場合
apple
applesauce
berryplum
kiwi
mango
mangoes
mangosteen
oranges
pineapples
plum
私はあなたの提案を試みたが、うまくいかなかった。次のように試してみましょう: 'awk '{if(i in a)if(index($ 0、i))next; a [$ 0]} 1' fruitsorted.txt'ここで' fruitsorted.txt'は私が示したリストです私の質問のトップこれにより、何も削除されずにリスト全体が再印刷されます。私はCygwin Bash(minntty 2.7.7)を使用しています。何か不足していますか?ありがとう。 – SSilk
@SSilkファイルにキャリッジリターンが含まれていますか? – 123
@EdMorton更新されたコマンドは、 – 123