如何使用 awk 在行尾打印字符串?

如何使用 awk 在行尾打印字符串?

我对 awk 很陌生。我正在尝试添加一个新的计算列。但是 awk 将该列插入到下一行而不是当前行的末尾。

这是我的数据的示例:

,2013-11-22,12.9,26.0,26.6,,,NW

我想做的是在末尾添加一列,其中包含“是”或“否”,基于第五列(如果 $5 > 0 是,否则为否)。

这是我的 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中的字段$N,对于N字段编号:$9 = "YES"将在末尾添加一个值为 的新字段"YES"

awk -F, -v OFS=, '{ if ($5 > 5) { $9 = "YES" } else {$9 = "NO"} };1' data

当我们分配 into 时,$9我们创建了第九个字段,这是该数据末尾之外的一个字段。放在1末尾会强制awk发生默认输出,否则我们会抑制该输出。

对于您的示例,上面为您提供:

,2013-11-22,12.9,26.0,26.6,,,NW,YES

我认为这就是你想要的。

如果您希望它成为最后一个字段,无论一开始有多少个字段,我们都可以使用 number of fields 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

相关内容