如何实现重复元素行转列后的列名对齐并将多步命令整合为单行命令
如何实现重复元素行转列后的列名对齐并将多步命令整合为单行命令
嘿,我来帮你搞定这两个问题,直接上实用方案:
一、让列名和内容完美对齐
你原来的输出用制表符分隔,可能因内容长度不同显得杂乱,有两个简单办法实现对齐:
方法1:用column -t自动对齐
这个命令会自动识别列分隔符,根据每列最长内容调整间距,让所有列整齐排列。修改你原来的最终命令即可:
paste -d'\t' - - - < output2.txt | awk 'BEGIN { print "real\tuser\tsys"} {print $0}' | column -t
输出效果:
real user sys 0m0.537s 0m0.077s 0m0.082s 0m0.512s 0m0.076s 0m0.083s 0m0.498s 0m0.072s 0m0.087s
方法2:用awk printf固定列宽
如果你想精确控制列宽,比如给每列留10个字符空间,用printf格式化输出更稳妥:
paste -d'\t' - - - < output2.txt | awk 'BEGIN { printf "%-10s %-10s %-10s\n", "real", "user", "sys" } { printf "%-10s %-10s %-10s\n", $1, $2, $3 }'
%-10s表示左对齐且占10个字符宽度,不管内容长短,列都会整整齐齐。
二、把所有步骤整合成一个单行命令
完全不需要生成中间文件,用awk就能一步处理原文件output.txt,跳过空行、收集数据、转列、对齐一气呵成,推荐这个单行命令:
awk '!/^$/ { vals[++count] = $2 } count == 3 { if (!printed_header) { printf "%-10s %-10s %-10s\n", "real", "user", "sys"; printed_header=1 } printf "%-10s %-10s %-10s\n", vals[1], vals[2], vals[3]; count=0 }' output.txt
简单拆解逻辑:
!/^$/:跳过空行;- 把每个非空行的第二个字段(时间值)存入数组
vals,用count计数; - 当
count到3时(收集完一组real/user/sys数据):- 若未输出过表头,先打印格式化表头;
- 按顺序打印三个时间值,用
printf保证对齐; - 重置
count为0,继续收集下一组数据。
这个命令直接处理原文件,无需任何中间步骤,干净又高效!
备注:内容来源于stack exchange,提问作者Pavel.S
相关产品推荐
相关产品推荐

