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