2013-01-11 94 views
1

我有一個來自第三方系統的文件,我需要修改一下。有時候即將出現的文件在數據中間包含一個新的行字符。假設我能找到這條損壞的線路。我需要做的僅僅是刪除新的行字符並將該行與上面的行聯繫起來(當我將刪除新行字符時會發生這種情況)。 這裏是例如:在bash的特定行中刪除換行符(將兩行合併成一行)

data_1 data_2 data_3 data_4 data_5 
data_1 data_2 data_3 data_4 data_5 
data_1 data_2 
data_3 data_4 data_5 
data_1 data_2 data_3 data_4 data_5 
data_1 data_2 data_3 data_4 data_5 
data_1 data_2 data_3 data_4 data_5 

正如你可以看到行號3是錯誤的,需要被固定/與線4通過移除新行字符接合。 我有一個簡單的腳本,能夠找到'錯誤'(太短)線。 問題是:如何從特定行中刪除新的行字符(我有一個錯誤的行號)。

我嘗試過sed(sed ':a;N;$!ba;3s/\n/ /' data.log),其中之前的s是行號,但它不起作用。

...或者對這個問題有更好的解決方案。請幫忙。

+0

是否有在當且僅當有一個多餘的換行符行開始的空間? – nrussell

+0

是的。在下一行的開頭(跟隨錯誤行的那一行)有一個'空格'。 – szymon

+0

你能指望在「腐敗」的情況下永遠存在的空間嗎? :-) 祝你好運。 – shellter

回答

3

則可以使用SED,趁着空間的新生產線的開始做

sed -e '{ 
N 
s/\n // 
}' data.log 

這並不需要你事先在寄生換行符都知道,但唯一正確的休息(如不若行被分成3個工作)

+0

哈哈好主意。可惜我沒有自己提出這個想法:-)。事實上,當損壞的線路在上方時,空間總是在新線路的前面。非常感謝! – szymon

2

如何從一個特定的行刪除換行符(我有一個 錯行號)

如果你已經想通了,然後用awk可以做到這一點的目標行號:

awk -v N=3 '{if (NR==N) l=$0; else if (NR==N+1) print l $0; else print}' infile 
+0

偉大的工作,但我讀awk很慢。我讀awk需要在開始處理之前讀取整個文件。我即將發佈的文件可能相當大。無論如何非常感謝工作解決方案:-)。 – szymon

+1

你對awk的假設是不正確的。 awk或sed在這裏表現的速度幾乎相同。 – anubhava

2

這是不是真的什麼你問了,但它會自動找到損壞的行並修復它們。只需設置你有多少列想到,通過設置col參數

awk -v col=5 ' 
      { 
       if ((cur + NF) < col) 
       { 
        printf($0); 
        cur=cur+NF; 
       } 
       else 
       { 
        print $0; 
        cur=0; 
       } 
      }' your_file