bash-每三行删除一次\n

bash-每三行删除一次\n,bash,awk,sed,Bash,Awk,Sed,如何从每三行中删除换行分隔符。 例如: 输入: 1 name John 2 family Grady 3 Tel 123456 输出: 1 name John 2 family Grady 3 Tel 123456 假设所有您想要连接到下一个端点的线都是:(您最初的问题): 为此,您可以使用sed,包括: sed ':a;/:$/{N;s/\n//;ba}' a是一个分支标签。检测模式:$(行尾的冒号),如果找到,则N将下一行追加到当前行,使用s/\N/替换命令删除它们之间的换行符,并使

如何从每三行中删除换行分隔符。 例如:

输入:

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

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
使用:

在该命令序列中,
n
将输出组中的第一行,并将其替换为第二行。然后,
N
将第三行附加到第二行,
s/\N/
将它们之间的换行符更改为一个空格,最后输出组合的两行和三行

然后它进入下一组三人,做同样的事情



这两个命令都将为各自的输入生成所需的输出。

假设所有这些行都要与下一个端点连接,并使用
(您最初的问题):

为此,您可以使用
sed
,包括:

sed ':a;/:$/{N;s/\n//;ba}'
a
是一个分支标签。检测模式
:$
(行尾的冒号),如果找到,则
N
将下一行追加到当前行,使用
s/\N/
替换命令删除它们之间的换行符,并使用
ba
命令将其分支回标签
a


对于编辑后的问题,您只想将每个三行组的第二行和第三行合并,而不考虑内容:

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

在该命令序列中,
n
将输出组中的第一行,并将其替换为第二行。然后,
N
将第三行附加到第二行,
s/\N/
将它们之间的换行符更改为一个空格,最后输出组合的两行和三行

然后它进入下一组三人,做同样的事情


这两个命令都将为各自的输入生成所需的输出。

这可能适用于您(GNU-sed):

要使用空格替换换行符,请执行以下操作:

sed 'n:N;s/\n/ /' file
另一种选择是使用粘贴:

paste -sd'\n \n' file
这可能适用于您(GNU-sed):

要使用空格替换换行符,请执行以下操作:

sed 'n:N;s/\n/ /' file
另一种选择是使用粘贴:

paste -sd'\n \n' file
输出:

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

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

您可以在Perl中执行此操作

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

您可以在Perl中执行此操作

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

另一个解决方案是Bash:

while read line
do
  if [[ $line = *: ]]
  then
    echo -n $line
  else
    echo $line
  fi
done < input.txt
读取行时
做
如果[[$line=*:]]
然后
回声线
其他的
回音$线
fi
完成
另一个解决方案,在Bash中:

while read line
do
  if [[ $line = *: ]]
  then
    echo -n $line
  else
    echo $line
  fi
done < input.txt
读取行时
做
如果[[$line=*:]]
然后
回声线
其他的
回音$线
fi
完成
使用AWK的单向:

awk '{ printf "%s%s", $0, (NR%3==2 ? FS : RS) }' file
使用AWK的一种方法:

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

$ paste -sd'\n \n' input
输出:

1
name John
2
family Grady
3
Tel 123456
1
name John
2
family Grady
3
Tel 123456
Unix方式:

$ paste -sd'\n \n' input
输出:

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

您确定
2
之后的输入样本是一致的吗?另一种解决方案可能是删除
\n
后面的所有
。抱歉!我有点困了:你敢肯定
2
之后的输入样本是一致的吗?另一种解决方案可能是删除
\n
后面的所有
。抱歉!我有点困:你能详细说明一下吗;N
part?@AvinashRaj问题是
bash-每三行删除一次\N
它并没有说用空格替换
\N
。@MandarShinde看到了,请详细说明
N;N
part?@AvinashRaj问题是
bash-每三行删除一次\N
它并没有说用空格替换
\N
。@MandarShinde请看,使用
$0”“
,而不是
%s',$0
。稍微短一点
awk'x=NR%3==2{printf”%s',$0}!x'
@confused00:如果输入字符串包含格式说明符,则会出现问题;i、 e.
printf()
将假定它的参数比应该的多。与其使用
$0”“
,不如更安全地使用:
%s',$0
。稍微短一点
awk'x=NR%3==2{printf”%s',$0}!x'
@confused00:如果输入字符串包含格式说明符,则会出现问题;i、 e.
printf()
将假定它的参数比它应该的多。如果有四个词,如
1某物名称John
,我们打算用它们做同样的事情,我们如何使用
n
n
?@Mandar,你应该问一个不同的问题,因为它会比隐藏在评论中的一个更容易被曝光。如果有四个词,比如
1某物名称John
,我们打算用它们做同样的事情,我们怎么能用
n
n
?@Mandar,你应该问一个不同的问题,因为它比隐藏在评论中的问题更容易被曝光。