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
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $c = '';
  5. while(<DATA>){
  6.         s/\s*\z//;
  7.         if($c ne substr($_, 0, 1)){
  8.                 $_ = "\n$_" if(length($c));
  9.         }
  10.         print;
  11.         $c = substr($_, -1, 1);
  12. }

  13. __DATA__
  14. 111||222||33
  15. 33||44
  16. 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
  1. awk -F"[|]+" '{if(NF==3){split($0,t,"||",s);a=$0;getline b;print a""s[1]""b}else{print}}' 1
  2. 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

  1. sed -r ':a;/(.*\|\|){3}/!N;s/\r?\n//;ta'
复制代码

作者: chengchow    时间: 2017-09-30 17:28
  1. [root@iZuf617rrh39krd2ux1mejZ tmp]# sed -r '1h;1!H;$!d;${g;s/([0-9]+\|\|[0-9]+\|\|[0-9]+)\n/\1/g}' aa.log
  2. 111||222||3333||44
  3. 1111||2222||33333||444
复制代码

作者: william_djj    时间: 2017-09-30 18:47
回复 7# 本友会机友会摄友会

是的。 还要优化下的话,应该要看楼主要求,是不是有可能是第三列分为多行的情况。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2