Linux 合并第n+行的列;1至第n行

Linux 合并第n+行的列;1至第n行,linux,shell,awk,scripting,Linux,Shell,Awk,Scripting,iostat可以显示持久设备名(使用-j id)而不是内核设备名(例如sda),但这也意味着“人类可读”输出的选项为-h。 这将产生如下输出(一行包含永久磁盘名,例如HOMES或DATADISK,下一行包含该磁盘的值) (在我的示例中,我通过管道将iostat的输出传输到awk'/{print strftime(“%Y-%m-%d%H:%m:%S”),$0}',以便在每行的开头都有一个时间戳): 如何合并这些行以获得以下结果: 2018-06-13 11:57:03 HOMES

iostat可以显示持久设备名(使用-j id)而不是内核设备名(例如sda),但这也意味着“人类可读”输出的选项为-h。 这将产生如下输出(一行包含永久磁盘名,例如HOMES或DATADISK,下一行包含该磁盘的值)

(在我的示例中,我通过管道将iostat的输出传输到awk'/{print strftime(“%Y-%m-%d%H:%m:%S”),$0}',以便在每行的开头都有一个时间戳):

如何合并这些行以获得以下结果:

2018-06-13 11:57:03 HOMES             0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-13 11:57:03 ARCHIVEDISK       0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:03 DATADISK          0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-13 11:57:05 HOMES             0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 ARCHIVEDISK       0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 DATADISK          0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90
使用awk:

awk 'NF==3{n=$3;next}{for(i=NF;i>2;i--) $(i+1)=$i;$3=n}1' file | column -t
如果行包含3个元素,则
awk
脚本将获取名称。 对于所有其他行,它将所有元素移动一个位置,前2个除外。 最后打印出了这一行

命令
column
正在重新格式化,以按列显示它。

perl -pe 'if ($. % 2) {
    chomp;
    $l = length;
} else {
    s/^.{19} */" " x (38 - $l)/e;
}' -- file
  • $。
    包含输入行号
  • %
    是模运算符,即
    $。%2
    对于第1、3、5、7行等返回true
  • /e
    s//
    替换的替换部分解释为代码,在这里它重复空格
    38-$l
    次,其中
    $l
    是前一行的长度(用于对齐数字)

    • awk,保持间距:

      awk '
          NR % 2 {label = $3; next}
          {print substr($0, 1, 19), label, substr($0, 22 + length(label))}
      ' file
      

      如果iostat输出如下所示:

      $ cat file
      HOMES
                        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
      ARCHIVEDISK
                        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
      DATADISK
                        0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
      HOMES
                        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      ARCHIVEDISK
                        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      DATADISK
                        0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90
      
      然后,您只需要一个简单的小awk命令(使用
      cat文件
      代替下面的
      iostat
      ):


      不需要添加时间戳,然后再次删除它们,不必要地调用strftime,通过字段、管道、对“column”的调用循环,这将破坏您的原始对齐,等等。

      更好的方法不是修复产生此输出的awk命令,而不是创建一个新的awk命令来处理现有的awk命令输出吗?现在就好像你在问拍摄后如何给你的脚包扎一样——只是不要拍摄它……大部分输出都是由iostat完成的。awk只在行首添加日期/时间。当然,我可能会对第一个awk实施例如olivs解决方案。。。但我更喜欢2个“简单”的awk命令,而不是1个“更复杂”的命令…因为你不知道一个awk命令是什么,你不知道它是否比两个由管道连接的awk命令更复杂。我希望它不会那么复杂。
      $ cat file
      HOMES
                        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
      ARCHIVEDISK
                        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
      DATADISK
                        0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
      HOMES
                        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      ARCHIVEDISK
                        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      DATADISK
                        0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90
      
      $ cat file | awk 'NR%2{dev=$0; next} {printf "%s %-18s %s\n", strftime("%F %T"), dev, substr($0,19)}'
      2018-06-22 10:34:09 HOMES              0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
      2018-06-22 10:34:09 ARCHIVEDISK        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
      2018-06-22 10:34:09 DATADISK           0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
      2018-06-22 10:34:09 HOMES              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      2018-06-22 10:34:09 ARCHIVEDISK        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
      2018-06-22 10:34:09 DATADISK           0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90