awkを使用して行の末尾に文字列を印刷するには?

awkを使用して行の末尾に文字列を印刷するには?

私は初めて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

フィールド番号にawkwithのフィールドに直接割り当てることができます。新しいフィールドは最後に次の値として追加されます。$NN$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

関連情報