2014-10-09 137 views
1

如何從每三行刪除一個新行分隔符。 例子:bash-刪除 n每三行

輸入:

1 
name 
John 
2 
family 
Grady 
3 
Tel 
123456 

輸出:

1 
name John 
2 
family Grady 
3 
Tel 123456 
+3

你確定後'你輸入樣本2'是一致的?另一種解決方案可能是刪除所有在':'之後的'\ n'。 – reto 2014-10-09 05:57:56

+0

對不起!我有點昏昏欲睡:D – ahb65 2014-10-09 06:04:14

回答

3

這可能會爲你工作(GNU SED):

sed 'n:N;s/\n/ /' file 

作爲替代使用膏體:

paste -sd'\n \n' file 
+2

您能否詳細說明'n; N'部分? – 2014-10-09 06:09:54

+0

@AvinashRaj問題說'bash-刪除\ n每三行'它不會說用空格替換'\ n'。 – potong 2014-10-09 06:12:59

+0

根據預期輸出進行了評論。 – 2014-10-09 06:14:16

2

假設所有那些你想加入下一個一端與:(您問題)線:

1 
name: 
John 
2 
family: Grady 
3 
Tel: 
123456 

您可以使用sed爲此,有:

sed ':a;/:$/{N;s/\n//;ba}' 

a是分支標籤。檢測到模式:$(冒號在行尾),如果找到N將把下一行追加到當前行,則使用s/\n//替換命令刪除它們之間的換行符,並使用ba命令將其分支回標籤a


爲了您編輯問題,你只是想不理會每個三線組的第二和第三線面相結合的內容:

1 
name 
John 
2 
family 
Grady 
3 
Tel 
123456 

用途:

sed '{n;N;s/\n/ /}' 

在該命令序列中,n將輸出組中的第一行並將其替換爲第二行。然後N會將第三行附加到第二行,並且s/\n/ /將在它們之間的換行符在最終輸出組合的二三行之前變爲空格。

然後它進入下一個三人組,並做同樣的事情。


這兩個命令都會爲它們各自的輸入生成所需的輸出。

+0

+1爲sed命令解釋.. – 2014-10-09 06:39:44

+0

如果有四個詞,比如'1 SOMETHING name John',我們打算用它們做同樣的事情,我們怎麼用'n '和'N'? – 2014-10-09 08:36:56

+0

@Mandar,你應該問一個不同的問題,因爲它會獲得比隱藏在評論中的更多的風險。 – paxdiablo 2014-10-09 08:53:21

2
awk 'NR%3==2{printf "%s ",$0;next}{print $0}' input.txt 

sed 'n;N;s/\n//' file 

與空間的使用,以更換新行

輸出:

1 
name John 
2 
family Grady 
3 
Tel 123456 
+1

而不是'$ 0「」',使用:'「%s」,$ 0'更安全。 – Steve 2014-10-09 06:15:38

+0

@Steve,謝謝,編輯。 – Ashkan 2014-10-09 06:23:11

+0

稍微短一點'awk'x = NR%3 == 2 {printf「%s」,$ 0}!x'' – 2014-10-09 07:02:36

2

你可以在Perl做到這一點,

$ perl -pe 's/\n/ /g if $. % 3 == 2' file 
1 
name John 
2 
family Grady 
3 
Tel 123456 
0

又一解決方案,在擊:用AWK

while read line 
do 
    if [[ $line = *: ]] 
    then 
    echo -n $line 
    else 
    echo $line 
    fi 
done < input.txt 
2

方式一:

awk '{ printf "%s%s", $0, (NR%3==2 ? FS : RS) }' file 
0

Unix的方式:

$ paste -sd'\n \n' input 

輸出:

1 
name John 
2 
family Grady 
3 
Tel 123456