直前のパスよりも深いテキストファイルのパスをフィルタリングします。

直前のパスよりも深いテキストファイルのパスをフィルタリングします。

ソートされたパスのリストを含むテキストファイルがある場合は、その親パス(直接かどうかにかかわらず)もリストにあるため、重複するすべてのパスを削除するにはどうすればよいですか?

たとえば、

/aaa/bbb
/aaa/bbb/ccc
/ddd/eee
/fff/ggg
/fff/ggg/hhh/iii
/jjj/kkk/lll/mmm
/jjj/kkk/lll/mmm/nnn

次のように減らす必要があります。

/aaa/bbb
/ddd/eee
/fff/ggg
/jjj/kkk/lll/mmm

私はawkで部分文字列を試しましたが、親パスが毎回同じレベルになることを保証できないため、正しく機能できません。

ベストアンサー1

私はこれが可能でなければならないと思います。追加のケースを追加するには、入力ファイルを編集してください。

$ cat ip.txt 
/aaa/bbb
/aaa/bbbd
/aaa/bbb/ccc
/ddd/eee
/fff/ggg
/fff/ggg/hhh/iii
/jjj/kkk/lll/mmm
/jjj/kkk/lll/mmm/nnn
/jjj/kkk/xyz

使用awk

$ awk '{for (i in paths){if (index($0,i"/")==1) next} print; paths[$0]}' ip.txt 
/aaa/bbb
/aaa/bbbd
/ddd/eee
/fff/ggg
/jjj/kkk/lll/mmm
/jjj/kkk/xyz
  • paths[$0]入力行によってキーが割り当てられた参照です。
  • for (i in paths)各行は、保存されたすべてのキーと比較されます。
  • if (index($0,i"/")==1) next/行の先頭に追加された保存キーと一致する場合は、入力行をスキップします。
    • //aaa/bbbdマッチングを避けるために使用/aaa/bbb

おすすめ記事