Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用AWK搜索字符串,然后重新排列_Sorting_Awk - Fatal编程技术网

Sorting 使用AWK搜索字符串,然后重新排列

Sorting 使用AWK搜索字符串,然后重新排列,sorting,awk,Sorting,Awk,我得到了以下格式的每月统计数据, 我需要做的是得到每列的最小值和最大值, 我已经使用awk使用这个脚本从一个大得多的文件中获取表 awk 'c-->3;/By Day/{c=35; print}' file1.txt 并获得输出: 白天: Separate user logon counts-(max sessions)-(external counts)-(lock actions): 2013/04/07 - 6 ( 6) ( 37) ( 0) 2

我得到了以下格式的每月统计数据, 我需要做的是得到每列的最小值和最大值, 我已经使用
awk
使用这个脚本从一个大得多的文件中获取表

awk 'c-->3;/By Day/{c=35; print}' file1.txt
并获得输出:

白天:

 Separate user logon counts-(max sessions)-(external counts)-(lock actions):
 2013/04/07 -      6    (   6)  (  37)  (   0)
 2013/04/08 -    190    (  70)  (6528)  (  30)
 2013/04/09 -    185    (  68)  (5986)  (  29)
 2013/04/10 -    213    (  85)  (5571)  (  36)
 2013/04/11 -    189    (  82)  (5410)  (  35)
 2013/04/12 -    165    (  69)  (5130)  (  25)
 2013/04/13 -     16    (  15)  ( 662)  (   0)
 2013/04/14 -     20    (  14)  (1016)  (   2)
 2013/04/15 -    160    (  64)  (6770)  (  39)
 2013/04/16 -    205    (  96)  (5978)  (  25)
 2013/04/17 -    197    (  83)  (5816)  (  37)
 2013/04/18 -    167    (  78)  (5554)  (  38)
 2013/04/19 -    152    (  71)  (5479)  (  29)
 2013/04/20 -     18    (  10)  ( 578)  (   1)
 2013/04/21 -     11    (   7)  (1018)  (   2)
 2013/04/22 -    193    (  74)  (6931)  (  30)
 2013/04/23 -    176    (  66)  (6184)  (  23)
 2013/04/24 -    192    (  74)  (5891)  (  26)
 2013/04/25 -    188    (  79)  (5575)  (  28)
 2013/04/26 -    170    (  75)  (5513)  (  26)
 2013/04/27 -     17    (  12)  ( 597)  (   0)
 2013/04/28 -     17    (  10)  (1021)  (   0)
 2013/04/29 -    193    (  79)  (6786)  (  38)
 2013/04/30 -    217    (  87)  (6094)  (  36)
 2013/05/01 -    185    (  82)  (5706)  (  32)
 2013/05/02 -    188    (  76)  (5602)  (  29)
 2013/05/03 -    167    (  63)  (5149)  (  21)
 2013/05/04 -     22    (  14)  ( 634)  (   1)
 2013/05/05 -     21    (  14)  ( 728)  (   1)
 2013/05/06 -      2    (   8)  (  46)  (   0)

我可以编辑
awk
脚本以按设置的列进行排序,并且只显示已排序的列和第一列吗?

我很确定您的脚本是巧合编程的。按原样递减变量
c
,然后测试输入中每一行的值是否大于3。根据结果,将打印该行,因为将执行默认块。第二个块似乎没什么用处,因为它与包含
的行匹配,但您的输入只包含一个匹配项?目前,
c
将被初始化为0,仅为递减,这意味着条件
c-->3
永远不会为真,因此此脚本将不使用当前输入打印任何内容

awk 'c-->3;/By Day/{c=35; print}' file1.txt
您应该发布原始文件以获得有关如何重写此脚本的帮助


忽略您的
awk
脚本并获取您当前的输入,我将删除括号并使用
sort
。例如,要对第五列进行数字排序:

$ sed 's/[()]//g' file | sort -nk5 | awk '{print $1,$5}'
Separate sessions-external
2013/04/07 37
2013/05/06 46
2013/04/20 578
2013/04/27 597
2013/05/04 634
2013/04/13 662
2013/05/05 728
2013/04/14 1016
2013/04/21 1018
2013/04/28 1021
2013/04/12 5130
2013/05/03 5149
2013/04/11 5410
2013/04/19 5479
2013/04/26 5513
2013/04/18 5554
2013/04/10 5571
2013/04/25 5575
2013/05/02 5602
2013/05/01 5706
2013/04/17 5816
2013/04/24 5891
2013/04/16 5978
2013/04/09 5986
2013/04/30 6094
2013/04/23 6184
2013/04/08 6528
2013/04/15 6770
2013/04/29 6786
2013/04/22 6931
编辑:

如果您有
GNU grep
,赛后打印35的最简单方法是在赛前打印3行:

grep -A35 -B3 'By Day' file

然后,使用数字排序选项
-n
对管道进行排序,并使用
-k
指定列,然后使用
cut
awk
仅获取所需列

打印包含“按天”的行以及随后的35行的正确方法是:

awk '/By Day/{c=36} c&&c--' file1.txt
现在,发布一些有代表性的输入(不,我们不需要35行-设为5行或更少)和该输入的预期输出,我们可以看看您接下来要做什么

我从一条评论中看到,你也想在“按日”之前打印这3行。这本身就是:

awk '
/By Day/{
    for (i=0;i<3;i++) {
        j=(NR+i)%3
        if (j in buf) {
            print buf[j]
        }
    }
}
{ buf[NR%3]=$0 }
' file
awk'
/白天/{

对于(i=0;它的awk脚本是搜索“By Day”,然后在它下面显示35行,在它上面显示3行。如果是这样的话,输入的第四行将包含
By Day
。要做到这一点,您需要类似
awk'/By Day/{n=NF}{a[NF]=$0}END{for(i=n-3;脚本几乎正确地遵循了常见的awk习惯用法,用于打印条件周围的范围(在本例中,RE后的n行),但它应该是
c&&c--
,而不仅仅是
c--
,我不知道
>3
在那里做什么。误导性的部分是OP只发布了他的输出,而不是他的输入。@EdMorton没有缓冲/解析两次就无法在条件之前打印行!?OP需要大约3行,后面35行。是的,我看,他在上面的评论中说,他在他的问题中没有提到这一点。我只是在评论剧本做了什么(或几乎做了什么)如果这就是OP想要做的,我会建议使用更简单的
grep-A35'By Day'文件
@sudo_O对,但听起来这只是一个起点,他想做一些额外的处理,也许他们没有访问GNU grep的权限(我不在某些生产机器上工作,也不能在那里安装)。
awk -v pre=3 -v post=35 '
/By Day/{
    for (i=0;i<pre;i++) {
        j = (NR+i) % pre
        if (j in buf) {
            print buf[j]
        }
    }
    c = post + 1
}
{ buf[NR%pre]=$0 }
c&&c--
' file