我收集了数据并将其保存在文件“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 个参数。这会产生语法错误,从而停止脚本。不过,我不知道为什么您没有收到语法错误消息。
即使进行了这些更正,这段代码仍然特别脆弱。即使格式的微小变化也会导致它失败。