Awk 如何使用bash高效地划分文件列?

Awk 如何使用bash高效地划分文件列?,awk,Awk,我有一个大的文本文件,格式如下: cat 10 5 20 pig 20 5 25 dog 0 5 0 goat 10 0 10 sheep 0 0 0 如何使用awk添加两个新列,一个包含第2列除以第4列,另一个包含第3列除以第4列?如果分母是0,那么我想插入一个0。例如: cat 10 5 20 0.5 0.25 pig 20 5 25 0.8 0.2 dog 0 5 0 0 0 0 goat 10 0 10 1 0 sheep 0 0 0 0 0 我试过: awk '{ print

我有一个大的文本文件,格式如下:

cat 10 5 20
pig 20 5 25
dog 0 5 0
goat 10 0 10
sheep 0 0 0 
如何使用awk添加两个新列,一个包含第2列除以第4列,另一个包含第3列除以第4列?如果分母是0,那么我想插入一个0。例如:

cat 10 5 20 0.5 0.25 
pig 20 5 25 0.8 0.2
dog 0 5 0 0 0 0
goat 10 0 10 1 0 
sheep 0 0 0 0 0
我试过:

awk '{ print $1, $2, $3, $4, $2/$4, $3/$4 }' input_file > output_file
但是,这会产生以下错误:

fatal: division by zero attempted

文件非常大,因此性能非常重要。任何帮助都将不胜感激

你能试试下面的吗

awk '{print $0, ($4 ? $2/$4 : 0), ($4 ? $3/$4 : 0)}' Input_file

以上说明:打印当前行,然后检查条件,如果第四个字段不是零,则打印$2/$4或打印0。然后再次检查第四个字段是否不为零,然后打印$3/$4或打印0。

请尝试以下操作

awk '{print $0, ($4 ? $2/$4 : 0), ($4 ? $3/$4 : 0)}' Input_file

以上说明:打印当前行,然后检查条件,如果第四个字段不是零,则打印$2/$4或打印0。然后再次检查第四个字段是否为零,然后打印$3/$4或打印0。

因为性能很重要,所以测试$4一次比测试两次要快:

awk '$4{print $0, $2/$4, $3/$4; next} {print $0, 0, 0}' Input_file
提高性能的折衷方案是重复代码2打印$0s,但在这种情况下这显然是最小的,而且所有解决方案都有一些代码重复


我很好奇,决定给我的3个最新答案计时,然后。下面是在MacOS上使用GNU awk的第三次运行计时结果,运行awk{for i=1;i生成一个1000万行文件,因为性能很重要测试$4一次要比测试两次快:

awk '$4{print $0, $2/$4, $3/$4; next} {print $0, 0, 0}' Input_file
提高性能的折衷方案是重复代码2打印$0s,但在这种情况下这显然是最小的,而且所有解决方案都有一些代码重复

我很好奇,决定对我所有的3个当前答案计时,下面是在MacOS上使用GNU awk的第3次计时结果,其中一个1000万行文件是通过运行awk'{for I=1;I
$ time awk '{print $0, ($4 ? $2/$4 OFS $3/$4 : "0 0")}' file10m >/dev/null

real    0m10.145s
user    0m10.058s
sys     0m0.064s
$ time /usr/bin/awk '{print $0, ($4 ? $2/$4 OFS $3/$4 : "0 0")}' file10m >/dev/null

real    0m13.993s
user    0m13.818s
sys     0m0.139s