2017-05-10 103 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