2014-10-09 68 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