私は初めてawkに触れました。新しい計算列を追加しようとしています。ただし、awk は現在の行の終わりではなく次の行に列を挿入します。
私のデータの例は次のとおりです。
,2013-11-22,12.9,26.0,26.6,,,NW
私が望むのは、5番目の列($ 5> 0の場合はyes、そうでない場合はno)に基づいて、「yes」または「no」を含む列を最後に追加することです。
これは私のawkコマンドです。
awk -F, '{
if($5 > 0) print $0, ",YES"; else print $0, ",NO"
}' data.csv
結果は次のとおりです。
,2013-11-22,12.9,26.0,26.6,,,NW
YES
この問題をどのように解決できますか?
答え1
フィールド番号にawk
withのフィールドに直接割り当てることができます。新しいフィールドは最後に次の値として追加されます。$N
N
$9 = "YES"
"YES"
awk -F, -v OFS=, '{ if ($5 > 5) { $9 = "YES" } else {$9 = "NO"} };1' data
に割り当てると、$9
このデータの終わりを超えるフィールドである9番目のフィールドが作成されます。1
最後に配置するとデフォルトのawk
出力が発生し、それ以外の場合は抑制されます。
たとえば、上記の内容は次のとおりです。
,2013-11-22,12.9,26.0,26.6,,,NW,YES
私はこれがあなたが望むものだと思います。
最後のフィールドにするには、最初にフィールド数に関係なく、フィールド数を使用してNF
それを超えていることを確認できます。
awk -v OFS=, -F, '{ if ($5 > 5) {$(NF+1)="YES"} else {$(NF+1)="NO"} };1' data
$
すべての数値式を受け入れるので、1を追加して次のNF
利用可能なフィールドにアクセスできます。
答え2
より短いawk
解決策:
$ awk -F',' '$(NF+1) = $5 > 0 ? "YES" : "NO"' OFS=',' file
ファイルにwindows
改行文字が含まれている場合は、それらを削除できます。
$ awk -F',' '{sub(/\r$/,"")} $(NF+1) = $5 > 0 ? "YES" : "NO"' OFS=',' file