我正在 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"}
。