我得到以下格式的月度统计数据,
我需要做的是为每列提供最小和最大的,
我已经使用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
脚本以按设置列排序,只显示已排序的列和第一列吗?
答案 0 :(得分:0)
我很确定你的脚本是巧合编程的。在它的情况下,你递减变量c
并测试它是否在输入的每一行上都大于3。根据结果,将打印行,因为将执行默认块。第二个块似乎无用,因为它匹配包含By Day
的行,但您的输入包含一个匹配?因为它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
,匹配前3行的最简单方法是打印35:
grep -A35 -B3 'By Day' file
然后使用数字排序选项-n
进行排序,并使用-k
指定列,并使用cut
或awk
仅抓取所需的列。
答案 1 :(得分:0)
打印包含“按日”和后续35行的行的正确方法是:
awk '/By Day/{c=36} c&&c--' file1.txt
现在,发布一些代表性的输入(不,我们不需要它是35行 - 使其为5或更少)和该输入的预期输出,我们可以看看你下一步要做什么。
我从评论中看到你想要在“By Day”之前打印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 -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