用于编写多个文件的AWK性能调整

时间:2017-05-10 20:34:48

标签: performance awk cpu gawk

gawk -v ff=${fileB} '
    /^1017/ { print $0 >> ff; next; }
    !(/^#/||/^1016/||/^1018/||/^1013/||/^1014/||/^1013/||/^1014/) {
        f=substr($0,11,2)".csv"; print $0 >>"../../" f;
    }
' ${csvfiles}

大文件包含各种2000万行。如果以1017开头,我们必须读取每行,无论行内容如何,​​都将在fileB中打印 如果它没有从上面的跳过列表开始(1016,1013..),它将被写入文件,其中文件名取自行内容。例如线 写在fg.csv中的1010,abcdefg,123453,343,3434,。我们做子串并从第二列获取fg。

问题是性能就像每秒35k线。是否可以加快速度?

sample input 
 Exclusion List 1016 1013 ..

 Include line number 1010,1017...

1016,abcdefg,123453,343,3434,

1010,abcdefg,123453,343,3434,

1017,sdfghhj,123453,343,3434,

1034,zxczcvf,123453,343,3434,

1055,zxczcfg,123453,343,3434,

sample output 

fileB.csv

1017,sdfghhj,123453,343,3434,

fg.csv

055,zxczcfg,123453,343,3434,

vf.csv

1034,zxczcvf,123453,343,3434,

1 个答案:

答案 0 :(得分:0)

试试这个:

gawk -v ff="$fileB" '
    !/^(#|10(1[6834]|24|55))/{ print > (/^1017/ ? ff : "../../" substr($0,20,2) ".csv") }
' "$csvfiles"

如果在文件打开/关闭时花费了所有时间,这可能会加快速度:

awk '!/^(#|10(1[6834]|24|55))/{print substr($0,20,2), $0}' "$csvfiles" |
sort -t ' ' |
awk -v ff="$fileB" '
    {
        curr = substr($0,1,2)
        str  = substr($0,3)
        if ( index(str,"1017") == 1 ) {
            out = ff
        }
        else if ( curr != prev ) {
            close(out)
            out = "../../" curr ".csv"
            prev = curr
        }
        print str > out
    }
' "$csvfiles"

我真的不确定它是否会更快但可能是因为简单的正则表达式,至少它是简洁的。