使用Linux bash根据行值对输出进行排序



我需要打印基于"常驻集大小"值排序的整个输出。

进程:wccpd
内存(字节(
总虚拟大小29.5
常驻机组尺寸4.0

进程:写回
内存(字节(
总虚拟大小0
常驻集大小0

进程:zxfrd
内存(字节(
总虚拟大小71.3
常驻机组尺寸3.9

perl非常擅长这类事情:

#!/usr/bin/env perl
use 5.12.0;
$/ = "";  # enable "paragraph mode"
my @f;
while(<DATA>) {
m/Resident Set Size (.*)/;
push @f, [$1, $_];
}
say $_->[1] foreach sort { $a->[0] <=> $b->[0] } @f;

__DATA__
Process: wccpd
Memory (bytes)
Total Virtual Size 29.5
Resident Set Size 4.0
Process: writeback
Memory (bytes)
Total Virtual Size 0
Resident Set Size 0
Process: zxfrd
Memory (bytes)
Total Virtual Size 71.3
Resident Set Size 3.9

这个想法很简单。将$/(也称为$INPUT_RECORD_SEPARATOR$RS(设置为空字符串将CCD_;段落模式";其中记录用空行分隔。然后,我们一次读取一个记录并解析每个记录以匹配";常驻集大小";然后,我们推送一个数组引用,该引用由[0]中的值和[1]中的整个记录组成。然后使用<=>运算符比较排序函数中的记录。

如果您在文件input中有输入,并且想直接执行类似的操作,您可以执行:

perl -00 -nE 'm/Resident Set Size (.*)/; push @f, [$1, $_]}
{ say $_->[1] foreach sort { $a->[0] <=> $b->[0] } @f' input

这与上面的脚本完全相同,其中-n执行while(<>)循环,-00启用段落模式。奇怪地不匹配的} {是用于-nperl习惯用法。-n标志基本上在整个脚本周围放置一个while(<>){ }循环,我们用第一个}结束该循环,并用(似乎不匹配的({匹配其右大括号。

最新更新