私のファイルには、ユーザーと監督者の関係を持つ次のデータがあります。
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
、必要に応じてスクリプトで出力形式を指定することもできます。
しかし、これは一般的です転移的閉鎖。