2012-11-25 56 views
1

我是一個使用正則表達式和處理文本的初學者。我需要做的是將文件中的文本格式化爲CSV格式以導入到電子表格中。使用sed或awk或其他文本處理器來查找/替換範圍內的數字

我需要找到一個具有一定範圍的數字並插入回車符 - \r - 在它後面並刪除一個逗號。我知道如何查找/替換特定字符,但不是在一系列字符或數字中。

這是處理:我有一個長文本文件,在這種格式。

Shimshon A 
(blank) 
November 24, 2012 
13,481 
jonathan t 
Laguna Niguel, CA 
November 24, 2012 
13,480 
scott b 
Sussex, NJ 
November 24, 2012 
13,479 

我添加行逗號和開始/在找到一個文本編輯器行引號月底結束/替換:

"Shimshon A", 
"(blank)", 
"November 24, 2012", 
"13,481", 
"jonathan t", 
"Laguna Niguel, CA", 
"November 24, 2012", 
"13,480", 
"scott b", 
"Sussex, NJ", 
"November 24, 2012", 
"13,479", 

但是,一旦當我刪除所有的回報,我需要插入到1範圍內13481號碼後返回這是因爲在CSV每一列必須是名稱,位置,日期和數目,像這樣:

"Shimshon A","(blank)","November 24, 2012","13,481" 
"jonathan t","Laguna Niguel, CA","November 24, 2012","13,480" 
"scott b","Sussex, NJ","November 24, 2012","13,479" 

回答

6

另一種方式來處理這個問題是考慮你的 數據集作爲四線

組使用awk

awk 'NR%4!=0 { printf "%s", $0; next } { sub(/,$/,"") }1' file 

結果:

"Shimshon A","(blank)","November 24, 2012","13,481" 
"jonathan t","Laguna Niguel, CA","November 24, 2012","13,480" 
"scott b","Sussex, NJ","November 24, 2012","13,479" 

說明:

正如你可以看到,這裏使用了modulus operator爲 'grep' 可以每行不是正好可以被f整除我們(即不是整數)。 'printf'語句將這些行打印在一起。 '下'會在成功時跳過。在所有其他時間,滯後逗號被刪除,並且行被打印(默認情況下,語句末尾的1是簡寫)。任何問題,請隨時詢問。 HTH。

你可能還集成逗號和雙引號的增加,通過簡單地改變printf聲明:

awk 'NR%4!=0 { printf "\"%s\",", $0; next } { printf "\"%s\"\n", $0 }' file 

使用GNU sed

sed -n 'N;N;N;s/\n\|,$//g;p' file 

或者之前加逗號和雙引號:

sed -n 'N;N;N;s/^\|$/"/g;s/\n/","/g;p' file 

結果:

"Shimshon A","(blank)","November 24, 2012","13,481" 
"jonathan t","Laguna Niguel, CA","November 24, 2012","13,480" 
"scott b","Sussex, NJ","November 24, 2012","13,479" 

說明:

雖然這種解決方案是要短得多,它具有與使用awk,與上述相同的情緒。對於第一個sed聲明:使用-n標誌禁用默認打印。追加三行到模式空間。在第四行,刪除換行符和滯後逗號。然後打印。

第二個sed聲明大同小異;將三行添加到模式空間。在第四行,用雙引號替換行的開始和結尾。同時用雙引號,逗號,雙引號替換換行符;全球。然後打印。 HTH。


從評論:

從我的經驗整理使用awk(儘管可能)會變得困難,而快速閱讀。這裏有一個方法,可以讓您重新使用一些我們已經使用其他兩個工具,pastesort寫以前的代碼:

paste <(awk -F, 'NR%4==2 { print $NF }' file) <(awk 'NR%4!=0 { printf "\"%s\",", $0; next } { printf "\"%s\"\n", $0 }' file) | sort | sed 's/[^"]*//' 

應當指出的是,該命令加逗號之前使用輸入和雙引號 - 正如您所看到的,它使用上述第二個awk命令。它通過在我們之前獲得的每個結果之前粘貼(與paste)「狀態」。然後這允許使用sort按字母順序排列該行。輸入完成排序後,sed用於剝離此信息。

+0

編輯完成。希望沒有太多的錯別字。評論歡迎。 – Steve

+0

另外,看到這個鏈接 - 你可能會發現它的洞察力:http://stackoverflow.com/questions/13550072/awk-insert-a-new-row-after-the-regular-expression/13550483#13550483 – Steve

+0

謝謝你們工作;我正在從這些例子中學習。 awk示例工作正常,我想出瞭如何從一個文件讀取並輸出到另一個文件,即file.txt> newfile.txt。 sed示例不想工作;第一個不會改變文本(在標準輸出上),第二個在處理所有內容時由於某種原因,它會去掉每行上的第一個和最後一個引號。可能是我在OS X上使用的sed;它似乎是POSIX sed而不是GNU sed。但是,awk工作正常,這對我很好。謝謝。 – markratledge

相關問題