2010-01-07 37 views
0

如何使用sed將大文本文件中的兩條特定相鄰行組合成一行?例如,我想將行號爲2001891和2001892的行組合成一行,並將其寫回到同一行位置的文件中(意思是行2001893和下面的行將向上移動)?在大文本文件中使用sed組合2行

我GOOGLE了周圍的教程和手冊sed但都太神祕,我(那些'2,3p;N;s/jam.l,21/.,lk;dczA[12]blahblah'意味着什麼?)

+1

「有些人在遇到Unix問題時,想'我知道,我會用sed',現在他們有兩個問題。」 - Unix-Haters手冊http://simson.net/ref/ugh .pdf – 2010-01-07 03:28:38

回答

4

我不是sed大師,但我想你想:(。上運行它重要的數據,當然之前嘗試沒有-i上的測試文件)

sed -i '2001891N;s/\n//' filename 

$ cat a.dat 
1 
2 
3 
4 
$ sed '2N;s/\n//' a.dat 
1 
23 
4 

我試過了更簡單的sed '2001891s/\n//',但當模式爲\n時,它不起作用。對於任何其他模式(例如sed '2001891s/a//'),它似乎工作。對於我來說,想想更多的時間已經太晚了,但我希望其中一位sed大師會用我簡單的sed命令解釋一下怎麼回事。

+2

爲了解釋這裏發生了什麼:'2001891'是'address';它告訴'sed'只能在符合這種模式的行上操作。 'N'告訴sed將下一行追加到'模式空間'(即它當前正在處理的文本)中。 ';'開始一個新的命令,最後'/ \ n //'去掉換行符。 – 2010-01-07 03:44:53

+0

是的,我要添加一個解釋,但你在我之前做過。謝謝! – 2010-01-07 03:45:58

+1

'sed'的''''''''和'y'命令在模式(或保持)空間的末尾沒有看到換行符(只有在結束符之前出現的換行符)。 – 2010-01-07 06:43:36

0
$ awk 'NR==2001891{printf $0;getline;print;next}1' file > temp;mv temp file 

OR

$ awk '{printf (NR==2001891)?$0:$0"\n"}' file > temp;mv temp file 
0

我相信你能做到一些使用cat的簡單魔法,文件重定向和nl命令。

+0

不,你不能。 – 2010-01-07 06:36:00

+0

是什麼讓你如此確定? – 2010-01-07 14:43:58