将垂直收集的数据转换为表格

将垂直收集的数据转换为表格

我收集了数据并将其保存在文件“data.txt”中,格式如下:

<$ MG_nr>
</200>company-type:Engine1
</210>company-name:STR
</220>address:XX
</230>nr:4568789
</240>zipcode:08765
</250>place:ljkmljubi
</260>phone:786754678
</270>fax:76756778
</$>
<$ MG_nr>
</280>company-type:Engine2
</290>company-name:STR
</300>address:XX
</310>nr:7675678
</320>zipcode:87867
</330>place:jkhgkl
</340>phone:87865
</350>fax:876578
</$>
<$ MG_nr>
</360>company-type:Engine3
</370>company-name:STR
</380>address:XX
</390>nr:78675467
</400>zipcode:87657
</410>place:uiytryui
</420>phone:87656788976
</430>fax:8976535467
</$>
<$ MG_nr>
</440>company-type:Engine4
</450>company-name:STR
</460>address:XX
</470>nr:876578y67
</480>zipcode:786578
</490>place:kljhgryui
</500>phone:8976546789
</510>fax:989765
</$>

我想把它变成这样的电子表格:

Type         Name   Address   Nr      Zipcode Place     Phone       Fax
------------------------------------------------------------------------
Engine1      STR     XX      4568789  08765   ljkmljubi 786754678   76756778
Engine2      STR     XX      7675678  87867   jkhgkl    87865       876578
Engine3      STR     XX      78675467 87657   uiytryui  87656788976  8976535467
Engine4      STR     XX      87657867 786578  kljhgryui 8976546789 989765

我尝试了在 上找到的这段代码U & L site,并尝试复制它:

#!/bin/bash
cut -d'>' -f 2 data.txt | awk -F: '
/^company-type:/{type[c]=$2}
/^company-name:/{name[c]=$2}
/^address:/{address[c]=$2}
/^nr:/{nr[c]=$2}
/^zipcode:/{zipcode[c]=$2}
/^place:/{place[c]=$2}
/^phone:/{phone[c]=$2}
/^Fax:/{fax[c]=$2;c++}
END {
 print "Type         Name   Address   Nr Zipcode Place Phone Fax"
 print "------------------------------------------------------------------------"
 for(x in type) {
  printf "%-10s %3d    %s      %s %s %s %s %s\n",
    substr(type[x],2),
    company-name[x],
    address[x],
    nr[x],
    zipcode[x],
    place[x]
    phone[x]
    fax[x]
 }
}' data.txt

但这不起作用,它只打印标题!

print "Type         Name   Address   Nr Zipcode Place Phone Fax"
 print "------------------------------------------------------------------------"

我无法弄清楚我做错了什么?

我很感激任何建议!或任何使上面的代码有效且更简单的建议。

答案1

这是一个更简单的解决方案:

awk -F'[>:]' 'BEGIN{print "company-type company-name address nr zipcode place phone fax"}{print $3}' data.txt | xargs -n8 | column -t

company-type  company-name  address  nr        zipcode  place      phone        fax
Engine1       STR           XX       4568789   08765    ljkmljubi  786754678    76756778
Engine2       STR           XX       7675678   87867    jkhgkl     87865        876578
Engine3       STR           XX       78675467  87657    uiytryui   87656788976  8976535467
Engine4       STR           XX       87657867  786578   kljhgryui  8976546789   989765

字段分隔符-F可以awk读取基于:和 的列中的数据>,然后awk打印第三列,相当于所需的实际数据,同时构造标题。

该输出通过管道传输到该xargs输出,将其重新组织为八列。最后,该命令column在结果列之间添加制表符和等间距。

答案2

虽然 Goro 提供了一个很好的解决方案,但为了更好地理解,我想我应该指出您的代码中的一些问题,这些问题使其无法正常运行:

  • 您收集变量上的数据索引c,但从未更改其值。您只能获得从此代码中读取的最后数据。所有早期数据都将被覆盖。解决此问题的一个简单方法是更改/^company-type:/{type[c]=$2} ​​为/^company-type:/{type[++c]=$2}.
  • 当您打印公司类型字段时,没有明显的原因,您将剥离它的第一个字符:substr(type[x],2),将产生“ngine1”,而不是“Engine1”(假设您的数据中没有实际被剥离的不可打印字符)。
  • 这可能是您看不到输出的原因:您需要在 place[x]、phone[x] 之后添加逗号。当 printf 在 place[x] 之后找不到逗号时,它会假定这是其最后一个参数,这使得它比 format 语句所需的 8 个参数少了 2 个参数。这会产生语法错误,从而停止脚本。不过,我不知道为什么您没有收到语法错误消息。

即使进行了这些更正,这段代码仍然特别脆弱。即使格式的微小变化也会导致它失败。

相关内容