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