2017-05-10 277 views
0
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} 

大文件AWK性能调整包含了各种20000000 lines.and我们要读每一行,如果它与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, 
+0

拆分大文件,并行运行块和'cat'结果到一个文件中。 – karakfa

+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" 

我真的不知道,如果它会更快,但它可能是由于简单的正则表达式,至少它是简洁的。

+1

嗨感谢您的帮助,我得到了更多的线开始数字像1024,1055等,有没有办法改变正则表达式接受最后两位数字? – Sads

+0

不客气,我更新了我的答案。 –

+0

看起来像这些是完整的领域。平等检查应该比正则表达式快。 – karakfa