【问题标题】:how to remove trailing \n inside awk in linux如何在linux中删除awk中的尾随\ n
【发布时间】:2014-06-17 13:59:48
【问题描述】:

我有一个这样的输入文件:

Apr 24 2014;
is;
a;
sample;
;
Jun 24 2014 123;
may 25 2014;
is;
b;
sample;
;
Dec 21 2014 987

...我想要这样的输出:

Apr 24 2014;is;a;sample;;Jun 24 2014 123
may 25 2014;is;b;sample;;Dec 21 2014 987

(我正在使用 ksh)

【问题讨论】:

    标签: linux awk ksh


    【解决方案1】:

    对于包含以下内容的数据文件:

    $ cat file
    Apr 24 2014;
    is;
    a;
    sample;
    ;
    Jun 24 2014 123
    may 25 2014;
    is;
    b;
    sample;
    ;
    Dec 21 2014 987
    

    你可以这样做:

    $ awk '{ORS=(NR%6?"":RS)}1' file
    
    Apr 24 2014;is;a;sample;;Jun 24 2014 123
    may 25 2014;is;b;sample;;Dec 21 2014 987
    

    我们将输出字段分隔符设置为在每 6 条记录后打印一个新行(默认值 RS)。

    你可以通过说将输出重定向到另一个文件

    awk '{ORS=(NR%6?"":RS)}1' file > newfile
    

    或执行以下操作以更改当前文件

    awk '{ORS=(NR%6?"":RS)}1' file > tmp && mv tmp file
    

    【讨论】:

    • 你应该尽可能地测试阳性,因为生成的代码比测试阴性更清晰,并且消除了引入双重否定的任何可能性,所以我会使用ORS=NR%6?"":RS而不是ORS=!(NR%6)?RS:""。我还要为可移植性的三元表达式加上括号:ORS=(NR%6?"":RS)`。 +1 虽然。
    • @EdMorton 一如既往的好反馈。更新了解决方案以纳入您的建议。
    【解决方案2】:
    perl -lne 'undef $a if($.%7==0);
               $a.=$_;
               if($.%6==0 ||(eof))
               {$a=~s/\;$//;print $a};' Your_file
    

    测试here

    【讨论】:

      【解决方案3】:

      虽然标题暗示了一个严格的 awk 解决方案,但也有一个 ksh 标签,因为它似乎是程序应该做的唯一事情,也许这也可以:

      paste -d'\0' - - - - - - < file
      

      就像awk 版本一样,第一行中仍然有一个尾随分号,输出示例中不存在该分号。不知道会不会有问题?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多