UNIXでのディープ検索拡張

UNIXでのディープ検索拡張

私のファイルには、ユーザーと監督者の関係を持つ次のデータがあります。

user |supervisor |id
-----|-----------|----
a    |   b       | 1
b    |   c       | 2
c    |   d       | 3
e    |   b       | 4

以下のように、ユーザーと監督者の関係階層を分析したいと思います。

user |supervisor |id
-----|-----------|----
a    |   b       | 1
a    |   c       | 1
a    |   d       | 1
b    |   c       | 2
b    |   d       | 2  
c    |   d       | 3
e    |   b       | 4
e    |   c       | 4
e    |   d       | 4 

ご覧のとおり、ユーザー「a」の場合、直属の監督者は「b」ですが、「b」は再び「c」を彼の監督者として持っています。したがって、間接的に「c」は「a」の監督者でもあります。たとえば、私の目標は、特定のユーザーの階層のすべてのレベルを分析することです。 Unixでこの機能を実装する最良の方法は何ですか?

ベストアンサー1

各ユーザーが入力ファイル(「ユーザー」列)に一度だけ表示されるとします。また、パイプ(|)区切り文字が実際にファイル内にあり、常に空白でデータと区切られ、ヘッダー行が次のように見なされます。いいえ実際に存在します。

これが使用された2段階のソリューションですawk。最初のステップでは、各人の監督者を含む配列を作成し、2番目のステップでは出力を作成します。

awk 'pass==1 { super[$1] = $3; }
     pass==2 {
                print
                user=$3
                while (super[user] != "") {
                        print $1, "|", super[user], "|", $5
                        user=super[user]
                }
             }
    ' pass=1 data pass=2 data

これにより、正しく整列されていない出力が生成されます。この問題を解決するにはパイプしてくださいcolumn -t。あるいはawk、必要に応じてスクリプトで出力形式を指定することもできます。

しかし、これは一般的です転移的閉鎖

おすすめ記事