Linux 删除bash中特定行中的新行字符(将两行合并为一行)
我有一个文件来自第三方系统,我需要纠正一点。不时出现的文件包含一个新的行字符在中间的数据。假设我能找到这条损坏的线路。我需要做的只是删除新行字符并将该行与上面的行连接起来(当我删除新行字符时会发生这种情况)。 以下是一个例子:Linux 删除bash中特定行中的新行字符(将两行合并为一行),linux,bash,sed,Linux,Bash,Sed,我有一个文件来自第三方系统,我需要纠正一点。不时出现的文件包含一个新的行字符在中间的数据。假设我能找到这条损坏的线路。我需要做的只是删除新行字符并将该行与上面的行连接起来(当我删除新行字符时会发生这种情况)。 以下是一个例子: 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 d
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
之前的3是行号,但它不起作用
。。。或者也许有更好的办法解决这个问题。请帮忙
如何从特定行中删除新行字符(我有一个
错误的线路号)
如果您已经计算出目标行号,则可以使用awk执行以下操作:
awk -v N=3 '{if (NR==N) l=$0; else if (NR==N+1) print l $0; else print}' infile
如何从特定行中删除新行字符(我有一个
错误的线路号)
如果您已经计算出目标行号,则可以使用awk执行以下操作:
awk -v N=3 '{if (NR==N) l=$0; else if (NR==N+1) print l $0; else print}' infile
您可以使用sed,充分利用新行开头的空间
sed -e '{
N
s/\n //
}' data.log
这并不要求您事先知道伪换行符的位置,但只会纠正一个中断(因为如果将换行符拆分为3,则它不起作用)您可以使用sed,利用换行符开始处的空间
sed -e '{
N
s/\n //
}' data.log
这并不要求您事先知道伪换行符的位置,但只会更正一个中断(因为如果将行拆分为3行,则此操作不起作用)这并不是您真正要求的,但它会自动查找损坏的行并修复它们。只需通过设置
col
参数来设置期望的列数
awk -v col=5 '
{
if ((cur + NF) < col)
{
printf($0);
cur=cur+NF;
}
else
{
print $0;
cur=0;
}
}' your_file
awk-v col=5'
{
如果((cur+NF)
这并不是您真正想要的,但它会自动查找损坏的行并修复它们。只需通过设置col
参数来设置期望的列数
awk -v col=5 '
{
if ((cur + NF) < col)
{
printf($0);
cur=cur+NF;
}
else
{
print $0;
cur=0;
}
}' your_file
awk-v col=5'
{
如果((cur+NF)
如果有多余的换行符,行的开头是否有空格?是的。在下一行的边界处有一个“空格”(紧跟错误行的那一行)。在“腐败”的情况下,你能指望空格一直存在吗?:-)祝你好运。如果有多余的换行符,行的开头有空格吗?是的。在下一行的边界处有一个“空格”(紧跟错误行的那一行)。在“腐败”的情况下,你能指望空格一直存在吗?:-)祝你好运。很好,它正在工作,但我读到awk相当慢。我了解到awk需要在开始处理之前读取整个文件。我即将发布的文件可能相当大。无论如何,非常感谢您的工作解决方案:-)。您对awk的假设是不正确的。awk或sed将在这里以几乎相同的速度运行。很好,它正在工作,但我读到awk相当慢。我了解到awk需要在开始处理之前读取整个文件。我即将发布的文件可能相当大。无论如何,非常感谢您的工作解决方案:-)。您对awk的假设是不正确的。awk或sed将在这里以几乎相同的速度运行。哈,好主意。很遗憾,我没有自己提出这个想法:-)。事实上,当损坏的线位于上方时,空间将始终位于新线前面。非常感谢!哈,好主意。很遗憾,我没有自己提出这个想法:-)。事实上,当损坏的线位于上方时,空间将始终位于新线前面。非常感谢!