【问题标题】:Print data between two TAGS using AWK or SED使用 AWK 或 SED 在两个 TAGS 之间打印数据
【发布时间】:2016-10-07 21:05:27
【问题描述】:

我的文本文件包含跟随模式

<SUBBEGIN
NAME : A ;
AGE : 10 ;
ADDRESS 1 : NO10;
ADDRESS 2 : X-Lane;
ADDRESS 3 : X-City ;
CITY : X-City;
<SUBEND
<SUBBEGIN
NAME : B ;
AGE : 30 ;
ADDRESS 1 : NO70;
ADDRESS 2 : Y-Lane;
ADDRESS 3 : Y-City ;
<SUBEND

我想按以下格式打印上面的输出,请好心帮我排序,我是 bash/shell 的新手

预期输出:

NAME : A ;AGE : 10 ;ADDRESS 1 : NO10;ADDRESS 2 : X-Lane;ADDRESS 3 : X-City ;CITY : X-City;
NAME : B ;AGE : 30 ;ADDRESS 1 : NO70;ADDRESS 2 : Y-Lane;ADDRESS 3 : Y-City ;

我尝试了以下 2 个代码,但两者都是在没有 TAG 的情况下打印上面的数据

awk  'BEGIN { FS = "<SUB" } ; { gsub(" ","",$0); print }' users.txt

awk '/<SUBBEGIN/{flag=1;next}/<SUBEND/{flag=0}flag' users.txt

【问题讨论】:

  • &lt;SUBBEGIN&lt;SUBEND 标签之外还有其他的行吗?

标签: bash awk sed


【解决方案1】:
awk '/<SUBEND/{print t;t="";next}!/<SUBBEGIN/{t=t?t" "$0:$0}' file

【讨论】:

    【解决方案2】:

    RS 更改为 "&lt;SUBBEGIN|&lt;SUBEND"。因此,这些标签之间的任何内容都将被视为一条记录。

    awk -v RS="<SUBBEGIN|<SUBEND" '{$1=$1;} /./{print $0}' inputfile
    NAME : A ; AGE : 10 ; ADDRESS 1 : NO10; ADDRESS 2 : X-Lane; ADDRESS 3 : X-City ; CITY : X-City;
    NAME : B ; AGE : 30 ; ADDRESS 1 : NO70; ADDRESS 2 : Y-Lane; ADDRESS 3 : Y-City ;
    

    【讨论】:

    • 您也可以使用'NF&gt;1{$1=$1; print}' 删除空白行。