切割或grep以捕捉特定的模式

时间:2013-01-15 14:09:47

标签: bash sorting grep cut

我有像这样的行

5.7015   40828240     +152             -> explode(string(1), string(21)) /f.inc:467
5.7020   40834040     +192             -> explode(string(1), string(21)) /f.inc:467
5.7020   40834088     +160             -> explode(string(1), string(21)) /f.inc:467
5.7023   40834392     +192             -> explode(string(1), string(21)) /f.inc:467
5.7027   40835000     +152             -> explode(string(1), string(21)) /f.inc:467

我想按列排序这样的输出,其中数字从加号开始(也正好在相同的列数中,有时可以从减号开始)。

所以我需要按第三列排序输出。我为此尝试了cut,但我无法达到结果

4 个答案:

答案 0 :(得分:3)

使用coreutils排序你可以这样做(使用通用数字排序顺序):

sort -k3,3g file

输出:

5.7015   40828240     +152             -> explode(string(1), string(21)) /f.inc:467
5.7027   40835000     +152             -> explode(string(1), string(21)) /f.inc:467
5.7020   40834088     +160             -> explode(string(1), string(21)) /f.inc:467
5.7020   40834040     +192             -> explode(string(1), string(21)) /f.inc:467
5.7023   40834392     +192             -> explode(string(1), string(21)) /f.inc:467

编辑 - 适应新输入

如果输入为listed by the OP,我认为需要一些预过滤才能加入相关的行,这与sed 'N; /\n *>=>/ s// >=>/; P; D'的行相似。合在一起:

< 1.xt.txt sed 'N; /\n *>=>/ s// >=>/; P; D' | sort -k3,3g

输出:

TRACE START [2013-01-15 13:17:48]
    0.0149    2268328       +0       -> realpath(string(36)) /htdocs/lib/functions.inc:2 >=> '/htdocs/lib'
    0.0016     942488      +80     -> header(string(38)) /htdocs/scripts/univexport.php:8 >=> NULL
    0.0016     941816     +160     -> error_reporting(long) /htdocs/scripts/univexport.php:4 >=> 22527
    0.0016     942008     +192     -> set_time_limit(long) /htdocs/scripts/univexport.php:5 >=> TRUE
    0.0148    2268328     +264       -> dirname(string(50)) /htdocs/lib/functions.inc:2 >=> '/htdocs/lib'
    0.0016     942408     +400     -> ini_set(string(12), string(5)) /htdocs/scripts/univexport.php:6 >=> '-1'
    0.0188    2651104  +382776       -> require_once(1/htdocs/lib/functions_common.inc) /htdocs/lib/functions.inc:2
    0.0014     941656  +941656   -> {main}() /htdocs/scripts/univexport.php:0
    0.0147    2268064 +1325576     -> include_once(/htdocs/lib/functions.inc) /htdocs/scripts/univexport.php:9

标题被排序到顶部,因为它被认为是一个字符串,一般的数字顺序决定了这样的顺序(来自GNU排序手册):

  
      
  • 不以数字开头的行(均被视为相等)。

  •   
  • NaNs(IEEE浮点运算中的“非数字”值),且顺序一致但依赖于机器。

  •   
  • 减无限。

  •   
  • 以数字升序排列的有限数字(-0和+0相等)。

  •   
  • 加上无限。

  •   

答案 1 :(得分:3)

可以告诉sort使用-k标志对特定列进行排序。

sort -g -k3 file

将对第三列进行排序。 -t可以更改默认为空格的字段分隔符

编辑:

添加了-g选项,强制排序使用常规数字排序

答案 2 :(得分:0)

awk '{print $3}' file| sed s'/+//'

答案 3 :(得分:0)

我假设您获得了'data.txt'中的数据。

然后只需使用

sort +2 -n data.txt

这将从第3列开始对文件进行排序。