【问题标题】:Format MultiLine Text File格式化多行文本文件
【发布时间】:2017-07-17 05:37:50
【问题描述】:

由于**grep -e "Full Name" -e "Address" -e "Celphone"|awk '{$1=$1;print}'**(在 bash 文件中),我有以下内容:

Full Name: Person A<p>
Address: Address A<p>
Celphone: Celphone A<p>
Full Name: Person B<p>
Address: Address B<p>
Full Name: Person C<p>
Address: Address C<p>
Full Name: Person D<p>
Address: Address D<p>
Celphone: Celphone D<p>

但是,我希望最终输出如下所示:

Full Name: Person A , Address: Address A, Celphone: Celphone A<p>
Full Name: Person B , Address: Address B<p>
Full Name: Person C , Address: Address C<p>
Full Name: Person D , Address: Address D, Celphone: Celphone D<p>

我的挑战是 Celphone 行并不总是出现在文件中,我不知道如何进行这种“条件连接”。

有人知道怎么做吗?

提前致谢。

【问题讨论】:

  • 发布初始文件内容

标签: bash awk sed gawk


【解决方案1】:

你可以通过awk命令来实现。

awk -F':' '{if(NR==1){printf("%s",$0)}else if($1~"Full Name"){printf("\n%s",$0)} else{printf(",%s",$0)}}' file

它会返回:

Full Name: Person A<p>,Address: Address A<p>,Celphone: Celphone A<p>
Full Name: Person B<p>,Address: Address B<p>
Full Name: Person C<p>,Address: Address C<p>
Full Name: Person D<p>,Address: Address D<p>,Celphone: Celphone D<p>

但我注意到在您的输出中,行之间没有&lt;p&gt;。如果你真的想要那样,那么你可以试试下面的命令:

awk -F':' '{if(NR==1){printf("%s",$0)}else if($1~"Full Name"){printf("\n%s",$0)} else{printf(" , %s",$0)}}' test.txt | sed 's/<p> ,/ ,/g'

它会返回:

Full Name: Person A , Address: Address A , Celphone: Celphone A<p>
Full Name: Person B , Address: Address B<p>
Full Name: Person C , Address: Address C<p>
Full Name: Person D , Address: Address D , Celphone: Celphone D<p>

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed  ':a;N;/\nFull Name:/!s/<p>\n/, /;ta;P;D' file
    

    收集行以获得完整记录,将&lt;p&gt; 和以下换行符替换为,。然后打印新记录并重复。

    【讨论】:

      【解决方案3】:
      sed -n '/^Full/{x;s/\n/, /g;1!p;d;};H;${g;s/\n/, /g;p;}' filename
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多