【问题标题】:How to use awk or sed to format a block style record into a table?如何使用 awk 或 sed 将块样式记录格式化为表格?
【发布时间】:2013-12-08 08:45:06
【问题描述】:

我正在尝试将块式记录转换为表格。该记录是有关磁盘的 AIX ODM 信息。

--------------------------------------------------------
lsattr -El hdisk2 :-

pvid           00f68614bd9b2da20000000000000000 Physical volume identifier       False
q_err          no                 Use QERR bit                     True
q_type         simple             Queue TYPE                       True
queue_depth    16                 Queue DEPTH                      True
reserve_lock   no                 Reserve Device on open           True
reserve_policy single_path        N/A                              True
rw_timeout     40                 READ/WRITE time out value        True
scsi_id        0x71003f           SCSI ID                          False
start_timeout  180                START UNIT time out value        True
ww_name        0x5000097208426d54 FC World Wide Name               False
--------------------------------------------------------
lsattr -El hdisk3 :-

pvid           00f686145f0caa790000000000000000 Physical volume identifier       False
q_err          no                               Use QERR bit                     True
q_type         simple                           Queue TYPE                       True
queue_depth    16                               Queue DEPTH                      True
reserve_lock   no                               Reserve Device on open           True
reserve_policy single_path                      N/A                              True
rw_timeout     40                               READ/WRITE time out value        True
scsi_id        0x71003f                         SCSI ID                          False
start_timeout  180                              START UNIT time out value        True
ww_name        0x5000097208426d54               FC World Wide Name               False
--------------------------------------------------------

所需的输出是一个列出 pvid、reserve_policy 和 ww_name 的表格,例如:

hdisk2 00f68614bd9b2da20000000000000000 single_path 5000097208426d54
hdisk3 00f686145f0caa790000000000000000 single_path 5000097208426d54

awk 或 sed 怎么做? 请帮忙。 谢谢

【问题讨论】:

    标签: bash sed awk


    【解决方案1】:

    这一行给出了你想要的:

    awk 'BEGIN{RS="---+\n";a["pvid"];a["reserve_policy"];a["ww_name"]}{printf "%s",$3;for(i=1;i<=NF;i++)if($i in a)printf " %s", $(i+1);print ""}' file
    

    可读性更好的版本:

    awk 'BEGIN{RS="---+\n"
               a["pvid"]
               a["reserve_policy"]
               a["ww_name"]}
    {printf "%s",$3
     for(i=1;i<=NF;i++)
         if($i in a)printf " %s", $(i+1)
     print ""}' file
    

    【讨论】:

    • 哇,太棒了。谢谢你,肯特。你知道关于 awk 的任何深入的在线教程吗?因为我只能找到初学者。
    • @rafa :一定要“接受”解决您问题的答案(意思是这个!;-))。就 awk 教程而言,您可以在 S.O.获得任何语言的高级经验都需要解决高级问题。所以继续插电。祝大家好运。
    • gnu.org/software/gawk/manual/gawk.html 我认为它适合初学者和“初学者”
    • @Kent,感谢您的帮助。我有一个后续问题。如果 ww_name 值为空,如何填写“N/A”?必须这样做以确保每个输出行始终具有相同数量的字段。可以用awk来完成吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 2019-07-26
    • 2013-08-29
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多