2017-05-10 5 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} 

Die große Datei enthält verschiedene 20 Millionen für das Schreiben lines.and wir jede Zeile zu lesen, wenn es mit 1017 beginnen, werden sie in fileB gedruckt werden, unabhängig von Linien Inhalt , wenn es nicht startet Start mit der obigen Skip-Liste (1016,1013..) wird es in eine Datei geschrieben, wo der Dateiname aus dem Zeileninhalt genommen wird. zum Beispiel die Zeile 1010,abcdefg,123453,343,3434, in fg.csv geschrieben. wir tun Teilstring und nehmen das fg von der zweiten Spalte.AWK Leistung stimmen mehrere Dateien

Das Problem ist die Leistung ist wie 35k Zeilen pro Sekunde. Ist es möglich, es schneller zu machen?

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

Teilen Sie die große Datei, führen Sie Chunks parallel und 'cat' die Ergebnisse in eine Datei. – karakfa

+0

[bearbeiten] Sie Ihre Frage und verwenden Sie die '' '' '' '' '' '' Taste, um Ihre Beispieleingabe/-ausgabe zu formatieren. Achten Sie auch darauf, welche Zahlen Sie ausschließen möchten, und stellen Sie sicher, dass Ihre Eingabe/Ausgabe und der Code dies widerspiegeln. –

Antwort

0

Try this:

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

Dies kann die Dinge beschleunigen, wenn die ganze Zeit auf Datei ausgegeben wird öffnet/schließt:

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" 

Ich bin wirklich nicht sicher, ob es Es wird schneller sein, aber es könnte aufgrund der einfacheren Regexp zumindest kurz sein.

+1

Hallo Danke für die Hilfe, ich habe mehr Zeilenanfangsnummer wie 1024,1055 etc, gibt es eine Möglichkeit, die Regex zu ändern, um die letzten zwei Ziffern der Zahl zu akzeptieren? – Sads

+0

Gern geschehen, ich habe meine Antwort aktualisiert. –

+0

sieht aus wie diese sind vollständige Felder. Die Gleichheitsprüfung sollte schneller als Regex sein. – karakfa

Verwandte Themen