尝试将 awk 脚本的输出重定向到新文件时出错

尝试将 awk 脚本的输出重定向到新文件时出错

我正在 awk 脚本中处理以下代码,我需要将输出重定向到同一脚本中的另一个文件。

我在第一个块中尝试做的是将第 9 列中的数字四舍五入,在第二个块中,我想通过计算百分比来创建一个新列。输出是正确的,但最后我想将所有行发送到一个文件。


BEGIN { FS=OFS="," }
NR==1 {print; next}
{ $8 = sprintf("%0.4f", $8) }
{ a[$0]++ }


BEGIN  { FS=OFS="," }
{ gsub(/\r/,"") }
FNR==1 { $10="Column"  }
FNR > 1 && ($12+0==$12 && $16+0==$16 && $13+0==$13){
  $10=sprintf("%0.4f",(($15-$16)/$13)*100)
}1

END {
  if (i>0){
    for  (i in a){
        print "i" > nj.csv
}}}

这是我的代码,执行它时出现错误,指向 nj 和 csv (nj.csv) 之间的点。有什么办法可以解决它吗?

答案1

您似乎正在流式处理记录,并将结果重定向到具有固定名称的单个文件。因此,无需存储任何内容(a[$0]++),也无需在 处循环任何内容END,也无需在 awk 内部进行重定向(您可以简单地对整个命令的输出进行 shell 重定向)。

我对你正在尝试做的事情的最佳猜测是:

awk -v RS='\r?\n' -F, '
  BEGIN{OFS = FS} 
  NR == 1 {$10 = "Survival Percentage"} 
  NR > 1 {
    $9 = sprintf("%0.2f",$9)
    $10 = ($5+0==$5 && $6+0==$6 && $3+0==$3) ? sprintf("%0.2f",(($5-$6)/$3)*100) : "N/A"
  } 
  {print}
' input.csv > nj.csv

我删除了,gsub(/\r/,"")转而设置输入记录分隔符来处理可选的 CR。这实际上相当于sub(/\r$/,"")- 我假设除了 EOL 之外,您实际上不需要处理 CR 字符。


要将其制作成脚本:

BEGIN{RS = "\r?\n"; FS = ","; OFS = FS}
  NR == 1 {$10 = "Survival Percentage"}
  NR > 1 {
    $9 = sprintf("%0.2f",$9)
    $10 = ($5+0==$5 && $6+0==$6 && $3+0==$3) ? sprintf("%0.2f",(($5-$6)/$3)*100) : "N/A"
  }
  {print}

然后执行由你的 shell 处理的重定向作为

awk -f awk_script.awk dataset.csv > nj.csv

或者使其成为可执行 awk 脚本

#!/usr/bin/awk -f

BEGIN{RS = "\r?\n"; FS = ","; OFS = FS}
  NR == 1 {$10 = "Survival Percentage"}
  NR > 1 {
    $9 = sprintf("%0.2f",$9)
    $10 = ($5+0==$5 && $6+0==$6 && $3+0==$3) ? sprintf("%0.2f",(($5-$6)/$3)*100) : "N/A"
  }
  {print}

使其可执行,然后运行

./awk_script.awk dataset.csv > nj.csv

如果你坚持放置输出awk 内部重定向那么它需要写成{print > "nj.csv"}

相关内容