bashで部分重複を削除するにはどうすればいいですか?


0

awk、grep、またはsortを使用して、bash内の部分的な重複を削除する方法を教えてください。
やってみた sort -u FILE | uniq -w20 しかし、それは本当に信頼できません。

入力:

http://www.website.com/1.file
http://www.website.com/2.file
http://www.website.com/3.file
http://www.someotherwebsite.com/1.file
http://www.someotherwebsite.com/2.file
http://www.someotherwebsite.com/3.file

期待される出力:

http://www.website.com/3.file
http://www.someotherwebsite.com/3.file

2
「部分的な重複を削除する」という意味を明確にしてください。
gogators

サンプル入力と希望の出力を提供してください。また、解決策は、一般的なテキストが何であるかを事前に知ることができますか、それとも最長の一般的な文字列を見つけるべきですか?その文字列は行の先頭に固定する必要がありますか?入力に異なる共通部分を持つ複数の異なるグループが含まれる可能性はありますか?それとも、入力ごとに単一の共通文字列があるのですか?
Eric Renouf

@EricRenouf完了しました。それは似たようなパスを持つURLのリストです。
user669761

URLにもディレクトリがありますか、それともホストとファイルだけですか?
Eric Renouf

@EricRenoufホストとファイルだけではありません。
user669761

回答:


1

すべての共通文字列がこのように整形式である場合の1つの解決策は、 awk 最初の3つのフィールドをキーとして使用します。

awk -F/ '{a[$1$2$3]=$0} END {for(k in a) {print a[k]}}'

これは各行を以下に基づいてフィールドに分割します。 / 区切り文字として。最初の3つのフィールドを配列のキーとして使用し、行全体を値として格納します。

入力が完了したら、配列をたどって値を出力します。これは、常に指定されたキーに一致する最後の行になります。

お勧めのとおり、最後の部分を削除し、残りを比較することで、これをもう少し柔軟にすることができます。

awk -F/ '{orig=$0; $NF=""; a[$0]=orig} END {for(k in a) {print a[k]}}'

これは行全体を変更せずに保存し、最後のフィールドを空の文字列にしてから、配列の残りの部分を前と同じように処理します。


最後のスラッシュまで比較してみませんか /124.ts
user669761

@ user669761それは今それをする方法、良い提案が含まれています
Eric Renouf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.