我有两个文件,目前我在awk中操作每个文件:
=======================文件1:===================
0x0002 RUNNING EXISTS foo 253 65535
0x0003 RUNNING EXISTS foo 252 5
0x0004 RUNNING EXISTS foo 251 3我对第一个领域和最后两个领域感兴趣。
字段1: vdisk(十六进制)。最后两个字段是每个vdisk的可能的vdisk。至少有一个必须存在。这些值是十进制的。如果出现数字"65535“,就意味着第二个cdisk不存在。
我使用这个awk显示一个用户友好的表:
awk 'BEGIN {print "vdisk cdisk Mr_cdisk"}
{
if ( $3 ~ /EXISTS|THIS_AGENT_ONLINE/ ) {
sub("65535", "N/A")
printf "%-11s %-6s %s\n",$1,$(NF-1),$(NF)
}
}' ${FILE}将制作此表:
vdisk cdisk Mr_cdisk
0x0002 253 N/A
0x0003 252 5
0x0004 1 3=======================文件2:===================
0x0000 Cmp cli Foo 0 SOME 0 0x0 0x0 0x0
0x0001 Cmp own Foo 1 NONE 0 0x0 0x0 0x0
0x0002 Cmp cli Foo 0 SOME 0 0x0 0x1 0x0
0x0003 Cmp own Foo 0 NONE 0 0x0 0x0 0x1
0x0004 Cmp cli Foo 0 SOME 0 0x0 0x0 0x0
0x0005 Cmp own Foo 1 NONE 0 0x1 0x0 0x0我对"Cmp自有“行感兴趣,其中第一个字段是Cdisk (十六进制)。结束后的第五个字段(就在“一些/无”文本之前)是实例号。它要么是0,要么是1。我使用这个awk来显示一个用户友好的表:
awk 'BEGIN {print "cdisk(hex) RACE_Instance"}
/Cmp own/ {
printf "%-11s %-10s\n",$1,$(NF-5)
}' ${FILE};这将产生下表:
cdisk(hex) Instance
0x0001 1
0x0003 0
0x0005 1++++++++++++++++++++++++++++++++++++++
我想显示一个合并的表。最好是直接从原始文件。它应该将第一个数据扩展到两行(如果有超过一个cdisk)。这将是合并的基础。然后打印实例号,如果在此cdisk存在的话。
vdisk(hex) cdisk(hex) Instance
0x0002 0x00fd N/A
0x0003 0x00fc N/A
0x0003 0x0005 1
0x0004 0x0001 0
0x0004 0x0003 1我肯定更喜欢使用awk的解决方案。:)
谢谢!
编辑:向一个数据表添加了更多信息和更正。
EDIT2:简化输入
发布于 2014-08-11 00:53:38
我不知道从2个输入文件到输出的映射是什么,但这应该指向正确的方向:
$ cat tst.awk
NR==FNR {
v2c[$1] = sprintf("0x%04x",$5)
v2m[$1] = ( $6==65535 ? "N/A" : sprintf("0x%04x",$6) )
next
}
$1 in v2c {
print $1, v2c[$1], $5
print $1, v2m[$1], $5
}
$
$ awk -f tst.awk file1 file2
0x0002 0x00fd 0
0x0002 N/A 0
0x0003 0x00fc 0
0x0003 0x0005 0
0x0004 0x00fb 0
0x0004 0x0003 0https://stackoverflow.com/questions/25229566
复制相似问题