我对 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
您可以直接分配到awk
with中的字段$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