bash - 合并和操作2个文件

时间:2014-08-10 14:29:35

标签: bash awk filemerge

我有两个文件,我目前在awk中操作每个文件:

=======================文件1:===================

 0x0002 RUNNING  EXISTS foo 253 65535
 0x0003 RUNNING  EXISTS foo 252 5
 0x0004 RUNNING  EXISTS foo 251 3

我对第一个字段和最后一个字段感兴趣。

字段1:虚拟磁盘(十六进制)。最后两个字段是每个虚拟磁盘的可能的Cdisk。必须至少存在1个。值是十进制的。 如果出现数字“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 own”行很感兴趣,其中第一个字段是Cdisk(十六进制)。结尾的第5个字段(在SOME / NONE文本之前)是实例编号。它是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

++++++++++++++++++++++++++++++++++++++

我想要显示合并表格。优选地,直接来自原始文件。 它应该将第一个数据分成2行(如果有超过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 :简化输入

1 个答案:

答案 0 :(得分:0)

我无法弄清楚从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 0