繁体   English   中英

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

[英]Sorting output based on row value with Linux bash

我需要打印基于“驻留集大小”值排序的整个 output。

进程:wccpd
Memory(字节)
总虚拟大小 29.5
居民集大小 4.0

过程:回写
Memory(字节)
总虚拟大小 0
居民集大小 0

进程:zxfrd
Memory(字节)
总虚拟大小 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 )设置为空字符串会将perl置于“段落模式”,其中记录由空行分隔。 然后我们一次读取文件一条记录并解析每条记录以匹配“驻留集大小”并找到您希望排序的值。 然后我们推送一个由 [0] 中的值和 [1] 中的整个记录组成的数组引用。 然后使用<=>运算符比较排序 function 中的记录。

如果您在文件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(<>){ }循环,我们用第一个}关闭该循环,并将其右大括号与(看似不匹配的) {匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM