Linuxでのデータ操作

Linuxでのデータ操作

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出力をパイプするか、grepawkスクリプトで実行できます。例えば

$ 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

関連情報