awk 条件过滤
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk 条件过滤相关的知识,希望对你有一定的参考价值。
要求将时间去掉,其他的输出不一定有规律,也不一定是总和为:组播为什么等,这是个面试题
Wed Apr 4 09:30:02 CST 2012
总和为: 133
组播为: 131
点播为: 1
Wed Apr 4 10:00:01 CST 2012
总和为: 136
组播为: 128
点播为: 5
Wed Apr 4 10:30:01 CST 2012
总和为: 130
组播为: 123
点播为: 4
Wed Apr 4 11:00:01 CST 2012
总和为: 126
组播为: 124
点播为: 2
Wed Apr 4 11:30:02 CST 2012
总和为: 127
组播为: 123
点播为: 1
Wed Apr 4 12:00:02 CST 2012
总和为: 133
组播为: 124
点播为: 3
Wed Apr 4 12:30:01 CST 2012
总和为: 131
组播为: 123
点播为: 4
Wed Apr 4 13:00:01 CST 2012
总和为: 127
组播为: 122
点播为: 3
用正则把直接取时间固定格式 xx:xx:xx 时分秒 ,然后grep -E正则扩展,-v反匹配,这两个参数合起来用,就过滤到时间所在的行了,不能象他们那样过虑特定字符,万一字符变了呢?只有时间固定格式全球统一,绝不会变!
正则的含义:[0-9]的数字 1,2出现一到两次 (\:转译冒号[0-9]1,2即[0-9]的数字出现一到两次)然后小括号里的出现2次,这样就组合成了任意 小时,分钟和秒了。
给分吧~~
[yuechengjun@localhost ~]$ grep -vE "[0-9]1,2(\:[0-9]1,2)2" aaa
具体的源文件如下:
总和为: 133
组播为: 131
点播为: 1
总和为: 136
组播为: 128
点播为: 5
总和为: 130
组播为: 123
点播为: 4
总和为: 126
组播为: 124
点播为: 2
总和为: 127
组播为: 123
点播为: 1
总和为: 133
组播为: 124
点播为: 3
总和为: 131
组播为: 123
点播为: 4
总和为: 127
组播为: 122
点播为: 3 参考技术A sed -i 's/^.*CST.*$//g' file #把时间删掉
awk 'sub(/.*CST.*/,"");1' file #awk的
后边那句:
其他的输出不一定有规律,也不一定是总和为:组播为什么等
我没听懂说的什么意思。 参考技术B 先确认一下你的问题: 仅仅去掉时间戳相关的行,保留其他所有的行,而且其他的行不一定都是很有规律的, 是这样吗???
如果是这样的话,可以参考这个思路:以CST作为分隔符
gawk -W re-interval -F"CST" ' !(NF==2 && $2~/[0-9]4/)print $0'
-W re-interval : 表示开启区间元字符, 如 4
'!(express) print $0' : 不满足表达式的时候才输出
awk根据条件过滤文件
我使用下面的代码来过滤我的源文件。此代码包含多个gsub条件
但是这里的问题是由于多个gsub,脚本需要花费大量时间来执行和解析另一个文件中的数据。你能不能让我知道实现这些条件的其他方法,以便我的脚本可以更快地执行
awk -F"[ ]" -v OFS="|" '{gsub(/^[ ]+|[ ]+$/,"");gsub(/"/,"");gsub(/[[:blank:]]+|.|-/,"",$32);gsub(/[[:blank:]]+|.|-/,"",$13);gsub(/^[[:space:]]+|[[:spa
ce:]]+$|,/,"",$38);gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$42);gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$44);gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);gsub(/^[[:spa
ce:]]+|[[:space:]]+$/,"",$40);gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);
下面是相同的代码,但是为了便于阅读而切片(仅限可读性):
awk -F"[ ]" -v OFS="|" '{gsub(/^[ ]+|[ ]+$/,"");
gsub(/"/,"");
gsub(/[[:blank:]]+|.|-/,"",$32);
gsub(/[[:blank:]]+|.|-/,"",$13);
gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$38);
gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$42);
gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$44);
gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);
gsub(/^[[:space:]]+|[[:space:]]+$/,"",$40);
gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);
如果需要输入文件,请告诉我,将分享
这不是答案,而是代码的可读版本:
awk -F"[ ]" -v OFS="|" '
{ gsub(/^[ ]+|[ ]+$/,"");
gsub(/"/,"");
gsub(/[[:blank:]]+|.|-/,"",$32);
gsub(/[[:blank:]]+|.|-/,"",$13);
gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$38);
gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$42);
gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$44);
gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);
gsub(/^[[:space:]]+|[[:space:]]+$/,"",$40);
gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);
}' # closing brace and quote were probably missing
以上是关于awk 条件过滤的主要内容,如果未能解决你的问题,请参考以下文章