2013-06-26 84 views
1

我正在處理大型文本數據集,大小約爲1 GB(最小的文件大約有200萬行)。每行應該被分成許多列。我說假設爲,因爲有例外;而正常線路以\r\n結尾,其中很多不正確地分成2到3線。快速多行正則表達式查找/替換 r和 n

假設有10列,每一行應該具有以下格式:

col_1 | col_2 | col_3 | ... | col_10\r\n 

例外具有以下格式:

1. col_1 | col_2 | col_3 ...\n 
    ... | col_10\r\n 

2. col_1 | col_2 | col_3 ...\n 
    ... | col_10\n 
    \r\n 

什麼是糾正這些的最快方法異常?我使用正則表達式(^[^\r\n]*)\n(替換爲$1)在1000行的樣本上做了一個簡單的文本編輯器(TextMate,Mac上)的查找/替換,並且它完美地工作。但文本編輯器顯然無法處理大文件(> = 200萬行)。這些可以使用sedgrep(或在其他一些命令行工具中,甚至在Python中)使用等效的正則表達式完成,以及如何執行?

+0

你的問題似乎對我很熟悉!我在我的例子中做的是我使用了分割(我使用Tcl),並計算獲得的元素數量,然後將兩行(或更多)添加到新文件中。我不知道如何在Python中做到這一點,但這是我使用的邏輯。 – Jerry

回答

1

你的方法:

perl -pe 's/(^[^\r\n]*)\n/\1/' input > output 

或者負回顧後:

perl -pe 's/(?<!\r)\n//' input > output 

或者,刪除所有\n每個\r\r\n取代:

perl -pe 's/\n//; s/\r/\r\n/' input > output 
+0

完美。謝謝! – Bernheim

1

爲什麼不能在awk? :

awk 'BEGIN{RS="\r\n"; FS="\n"; OFS=" "; ORS="\r\n";} {print $1,$2}' input 

或TR + sed的:

cat input | tr '\n' ' ' | tr '\r' '\n' | sed 's/^ \(.*\)/\1\r/g' 
+0

這看起來不正確。 'awk'命令似乎只是刪除了「尾部」部分,雖然'cat'命令可以正確執行,但它會在每行的末尾添加額外的'r'字符。無論如何,我接受了另一個答案。它正是我想要的,而且很快。 – Bernheim