2015-01-16 26 views
0

數據採樣結束:如何刪除換行符,如果該行不以「

"data","123" 
"data2","qwer" 
"false","234 
And i'm the culprit" 
"data5","234567" 

輸出文本應該是

"data","123" 
"data2","qwer" 
"false","234And i'm the culprit" 
"data5","234567" 

從本質上說,我要解決我的csv文件(這是非常大)

我使用SED所以在sed的答案將有很大的幫助:)

+1

如果你有一個結束'「'? – Jubobs

+0

這不是一個問題,我想以後尾隨空白,CSV不檢測這些作爲問題,我們總是可以修剪 –

+1

你需要確保你的文件在運行Ed的命令之前不包含尾隨的空格 – Jubobs

回答

0

戰略經濟對話總是對任何問題的錯誤的選擇涉及多條線。只需使用AWK:

$ awk '{printf "%s%s", (prev~/"$/?RS:""), $0; prev=$0} END{print ""}' file 
"data","123" 
"data2","qwer" 
"false","234And i'm the culprit" 
"data5","234567" 

以上只是檢查,如果上一行與"結束,如果它沒有那麼它打印默認的記錄分隔符(這是一個換行符 - 你可以用口服補液鹽或硬替換RS如果你喜歡,則編碼爲"\n"),但如果沒有,則不會打印任何東西。然後它會打印當前記錄,之後沒有換行符。在所有東西的最後打印一個換行符。

+0

你能否好好解釋一下,它的工作原理是:) –

+1

這樣做會失敗, tespace。例如,嘗試在原始文件的「123」後添加幾個空格,保存該文件,然後再次運行命令。 – Jubobs

+0

添加說明。 @Jubobs OP在他之前的評論中特別提到了尾隨空格,並表示這不是問題。 –

0

爲了完整起見,與SED它可以這樣做:

sed '/"\s*$/! { :loop; N; //! { $! b loop }; s/\n//g }' 

這種工作方式如下:

/"\s*$/! { # if a line does not end with double quotes (possibly followed 
       # by whitespaces) 
    :loop  # jump label "loop" 
    N   # fetch the next line 
    //! {  # unless the content of the pattern space matches the 
       # previously attempted pattern (that is: unless it ends with a 
       # double quote, which is the case iff the last fetched line does) 
    $! b loop # and unless we reached the end of the input ($!), 
       # go back to "loop" 
    } 
    s/\n//g  # remove all newlines from the accumulated lines in the 
       # pattern space 
} 

因此,這個積累不以結束連續行在模式空間中雙引號,然後在打印該行之前將它們粘貼到一行。

+0

對我來說不是2點。1)奇怪地(閱讀它應該的代碼),'s/\ n // g'never不會發生2)最後一行未終止'''不會被打印 – NeronLeVelu

+0

這兩種情況都被處理;我只能說「作品對於我來說,「你使用的是GNU sed嗎? – Wintermute

+0

我不確定BSD sed是否理解'\ s',它可能有助於用'[\ t]替換它來覆蓋最常見的情況。」 – Wintermute

0
sed ':cycle 
$ b 
/"$/ !N;s/\n//;t cycle' YourFile 

SED的版本,但不是最適合這種操作的