用于写入多个文件的 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"
我真的不确定它是否会更快,但这可能是由于更简单的正则表达式至少它是简洁的。
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"
我真的不确定它是否会更快,但这可能是由于更简单的正则表达式至少它是简洁的。