ルートリストでの冗長パスフィルタリング

ルートリストでの冗長パスフィルタリング

次の相対パスのリストがあります。

dir1
dir2
dir2/dir3
dir2/file1
dir3/file2
dir3/dir4
dir3/dir4/file3

上記の例では、エントリにファイルが含まれているため、指定子dir2/file1(例:)が重複しています。dir2

本質的に私が望むのは、与えられたパスのリストから重複したパスを削除することです。上記の例では、次のように出力します。

dir1
dir2
dir3/file2
dir3/dir4

指定されたファイルとディレクトリが実際にファイルシステムに存在する必要はありません。

私は一般的なUnixコマンド(sed、awk、perlなど)を使うことに興味があります。

答え1

相対パスのリストがファイル名「パス」にあるとします。

次のawkスクリプトを使用して印刷して、目的の出力を取得できます。

 $ awk 'BEGIN{FS="/";} {arr[$1]=$0;count[$1]+=1;} END{for(i in arr){if(count[i]==1){print arr[i]}else{print i}}}' path

それがどのように機能するか理解してください。

答え2

まあ、私は自分の質問に答えます。

@pradeepchhetriのソリューションに基づいて独自のawkスクリプトを作成しました。

cat data.txt | sort | awk '
BEGIN{FS=OFS="/";}{
    path=$0;
    for(i=NF;i>0;i--){
        NF--;
        if($0 in paths){next;}
    }
    paths[path]=path;
}
END{for(path in paths){print path;}}' | sort

これは私の目的に適しています。

関連情報