我有一个包含数百万行和数千个列/字段的输入文件。任何人都可以向我解释,为什么下面两种awk方法产生相同的输出,在CPU运行时间方面差异如此之大?awk性能和CPU运行时间
175.0秒:
awk 'BEGIN{FS=":| "}NR>1{field1=$1;field2=$2;$1="";$2="";print field1":"field2,field1":"field2,field2,$0}' file_in > file_out
19.7秒:
cat file_in | awk 'BEGIN{FS=":"}NR>1{print $1,$2}' | awk '{print $1":"$2,$1":"$2,$0}' | cut -d " " -f 3 --complement > file_out
这里是第二和一个file_in只需几百列/场中的第3行(有线之间没有断线):
1:1000071 C T 1 0 0 1 0 0
1:1000759 C T 1 0 0 0 1 0
下面是file_out的相应行:
1:1000071 1:1000071 1000071 C T 1 0 0 1 0 0
1:1000759 1:1000759 1000759 C T 1 0 0 0 1 0
1st比2nd慢吗?哦...我以为2nd会慢一点.... – Kent 2013-02-17 11:06:55
@Kent字符串连接在awk中很慢,因为它需要计算结果字符串的大小,找到一个足够容纳该字符串的内存区域,将字符串放在那里,然后释放原始的内存区域。它比I/O更慢,所以“打印一个;打印b'而不是'c = a“\ n”b;打印c'。所以通过给字段赋值来重新赋值$ 0可能是这里的罪魁祸首。 – 2013-02-17 11:16:20