次の形式で生成されたCSVがあります。
unixtime;host_name;ip_adress;description;2;0;1
私は以下を行うためにこのcsvを解析しようとしました。
フィールド 1 を Unix タイムスタンプから人間が読めるように変更します。
フィールド5を2からキーに変更
フィールド6と7を次のように変更します。
値が0の場合はNOに、1の場合はyesに置き換えます。
私はこれで最初の2つを成功させました。
cat test.csv |
/opt/csw/bin/gawk -F";" '{OFS=";"; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' |
/opt/csw/bin/gawk -F";" '{OFS=";"; gsub("2", "CRITICAL", $5)}1'
しかし、$ 6と$ 7フィールドで1を例に、0をnoに変更するにはどうすればよいですか?
これを試してみると、ゼロが見つかったすべての場所が置き換えられます。
gawk 'BEGIN {OFS=FS=";"} {if ($6== "0") gsub ($6,"NO"); print }' sample.csv
記録のために私はSolarisを使用しており、opencswからgawkをインストールしました。
答え1
次のgawk
プログラムが役に立ちます。
echo -e "unixtime;host_name;ip_adress;description;2;0;1\n1234567890;hName;hIP;hDesc;2;1;0" |
gawk -F";" 'BEGIN {OFS=";"} {
if (NR<2) next;
$1=strftime("%Y-%m-%d %H:%M:%S", $1);
$5=($5==2?"CRITICAL":$5);
$6=($6?"Yes":"No") ; $7=($7?"Yes":"No") ;
print}'
2009-02-14 00:31:30;hName;hIP;hDesc;CRITICAL;Yes;No
ここで最も重要なことは、awk
一度の呼び出しに複数のコマンドを入れることができるということです。
$6=($6?"Yes":"No")
あるいは、より正式には、(condition?consequence:alternative)
「三項」演算子として知られています。if (condition) consequence else alternative
ヘッダー行を印刷するには絶え間ない、「スキップ」の代わりに、次のように書くことができます。if (NR<2) {print;next} ;
編集:OFS割り当てをBEGINブロックに移動する@casのパフォーマンス改善のヒントを実装しました。