Chinaunix
标题:
请问如何去掉文本某一列中含有的换行符
[打印本页]
作者:
reallytrue
时间:
2017-09-29 21:04
标题:
请问如何去掉文本某一列中含有的换行符
RT,例如一个TXT文件,字段间分隔符是||,其中若干条记录中第三个字段含有换行符,如何去掉?
111||222||33
33||44
1111||2222||33333||444
希望替换成:
111||222||3333||44
1111||2222||33333||444
谢谢!
作者:
sunzhiguolu
时间:
2017-09-29 23:20
#!/usr/bin/perl
use strict;
use warnings;
my $c = '';
while(<DATA>){
s/\s*\z//;
if($c ne substr($_, 0, 1)){
$_ = "\n$_" if(length($c));
}
print;
$c = substr($_, -1, 1);
}
__DATA__
111||222||33
33||44
1111||2222||33333||444
复制代码
作者:
william_djj
时间:
2017-09-30 10:44
按楼主要求,字段分隔符是||, 假设只有三个字段的行才是有问题的行,才需要合并下一行。四个字段的行是正确的行,不用任何处理。a1.awk如下:
BEGIN{
FS="\\|\\|";
last="";
}
{ if(last!="")
{ print last$0;
last="";
}
if(NF==3)
{ last=$0;
next;
}
if(NF==4)
{ print $0;
last="";
}
}
abc.txt是待处理数据文件
111||222||33
33||44
1111||2222||33333||444
执行脚本:
$awk -f a1.awk abc.txt
作者:
wh7211
时间:
2017-09-30 12:06
回复
1#
reallytrue
文件1内容如下:
111||222||
33
33
||44
55||66
111||222||
33
77
||88
1111||2222||33333||444
awk -F"[|]+" '{if(NF==3){split($0,t,"||",s);a=$0;getline b;print a""s[1]""b}else{print}}' 1
awk -F"[|]+" '{f=NF==3?1:0}f{a=$0}!f{b=a?a""$0:$0;print b;a=""}' 1
复制代码
输出:
111||222||
3333
||44
55||66
111||222||
3377
||88
1111||2222||33333||444
作者:
本友会机友会摄友会
时间:
2017-09-30 14:46
提示:
作者被禁止或删除 内容自动屏蔽
作者:
william_djj
时间:
2017-09-30 14:57
回复
5#
本友会机友会摄友会
如果超过4列的,看看对不对? 把代码改下:
BEGIN{
FS="\\|\\|";
last="";
}
{ if(last!="")
{ print last$0;
last="";
}
if(NF==3)
{ last=$0;
next;
}
if(NF>=4)
{ print $0;
last="";
}
}
作者:
本友会机友会摄友会
时间:
2017-09-30 15:35
提示:
作者被禁止或删除 内容自动屏蔽
作者:
moperyblue
时间:
2017-09-30 16:08
sed -r ':a;/(.*\|\|){3}/!N;s/\r?\n//;ta'
复制代码
作者:
chengchow
时间:
2017-09-30 17:28
[root@iZuf617rrh39krd2ux1mejZ tmp]# sed -r '1h;1!H;$!d;${g;s/([0-9]+\|\|[0-9]+\|\|[0-9]+)\n/\1/g}' aa.log
111||222||3333||44
1111||2222||33333||444
复制代码
作者:
william_djj
时间:
2017-09-30 18:47
回复
7#
本友会机友会摄友会
是的。 还要优化下的话,应该要看楼主要求,是不是有可能是第三列分为多行的情况。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2