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

AWK performance tune for writing multiple files

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

大文件包含各种2000万lines.and我们必须读取每一行,如果它以1017开始,它将打印在文件B中,而不考虑行内容 如果它不是从上面的跳过列表开始的(1016,1013..),它将被写入文件,其中文件名取自行内容。例如线 1010,abcdefg,123453,343,3434,写在fg.csv。我们做子串并从第二列中取出 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,

试试这个:

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

如果所有时间都花在文件上,这可能会加快速度 opens/closes:

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

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