gawkを使用して、Solarisからcsvの複数のフィールドを解析します。

gawkを使用して、Solarisからcsvの複数のフィールドを解析します。

次の形式で生成された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のパフォーマンス改善のヒントを実装しました。

おすすめ記事