我有一個包含數百萬行和數千個列/字段的輸入文件。任何人都可以向我解釋,爲什麼下面兩種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