1つのファイルにデータがあります。
例:
a1b1:online
xxxx:offline
wxyz:enable
a2b2:online
txtx:disable
単一データの場合は問題になりませんが、オンラインの二重情報はどうですか?
次の情報をどのように表示できますか?
data a1b1 a2b2 are online --- how to get this
data xxxx are offline -- no issue
data wxyz are enable -- no issue
答え1
$ awk -F: 'a[$2] {a[$2] = a[$2]" "$1; next};
{a[$2]=$1};
END {for (s in a) { print "data " a[s] " are " s }}' input.txt
data xxxx are offline
data txtx are disable
data a1b1 a2b2 are online
data wxyz are enable
これは連想配列a
(ステータス$ 2として入力)を使用して、その状態のホスト($ 1)を保存します。その状態の配列要素がすでに存在する場合は、スペースとホスト名が追加されます。それ以外の場合は、ホスト名で要素を作成します。
(私は彼らがホスト名であると仮定しています - それは問題ではありません。コードは定義ではなくデータで動作します)
入力ファイル全体を読み込んだ後、目的の形式で配列を印刷します。
の連想配列はawk
特定の順序で保存されないため、出力は順序付けされません。ソートする必要がある場合は、awkスクリプトで実行できますが、出力をsort
。
ステータスにのみ興味がある場合は、online
出力をパイプするか、grep
awkスクリプトで実行できます。例えば
$ awk -F: '!/online/ {next};
a[$2] {a[$2] = a[$2]" "$1; next};
{a[$2]=$1};
END {for (s in a) { print "data " a[s] " are " s }}' input.txt
data a1b1 a2b2 are online
答え2
注文する
for i in `awk -F ":" '{print $NF}' filename | sed '/^$/d'| awk '{if(!seen[$NF]++)print }'`; do awk -v i="$i" -F ":" '$NF == i{print $1}' filename |sed "N;s/\n/ /g"| awk -v i="$i" '{print "data" " " $0" " "are "i}'; done
出力
data a1b1 a2b2 are online
data xxxx are offline
data wxyz are enable
data txtx are disable