繁体   English   中英

仅打印以某些数值结尾的行

[英]Only Print Lines that End with Certain Numerical Values

我有一个由空格分隔符和两列组成的CSV文件。

我需要grep任何以第一列中的06,12,18 或00结尾的行。

file.txt的

2017121106 22.9
2017121109 19.4
2017121112 17.2
2017121115 9999.0
2017121118 9999.0
2017121121 9999.0
2017121200 9999.0
2017121203 9999.0
2017121206 16.3
2017121209 13.1
2017121212 8.8
2017121215 8.1
2017121218 10.5
2017121221 8.6

试图代码:

egrep '(00|06|12|18)$' file.txt

预期产出:

2017121106 22.9
2017121112 17.2
2017121118 9999.0
2017121200 9999.0
2017121206 16.3
2017121212 8.8
2017121218 10.5

在终端中运行此代码时,我得到一个空的返回。

我究竟做错了什么?

所以...... grep命令不理解“字段”。 它只了解模式。 因为你的“第一列”是一个数字后面有一个空格的模式,你匹配 ,而不是使用$

$ egrep '^[0-9]+(00|06|12|18) ' file.txt

请注意带括号的表达式末尾的空格字符。 初始[0-9]+就位,这样我们就可以将这个正则表达式锚定到行的开头,这样可以确保我们匹配第一个“字段”。

一个更好的解决方案可能是使用awk ,它确实理解字段:

$ awk '$1~/(00|06|12|18)$/' file.txt

awk来救援!

awk '!(substr($1,length($1)-1)%6)' file

会给

2017121106 22.9
2017121112 17.2
2017121118 9999.0
2017121200 9999.0
2017121206 16.3
2017121212 8.8
2017121218 10.5

你在最后两位数字中看到6的倍数, 当剩余部分除以6时 ,转换为awk作为打印线

该解决方案的工作原因是数据的域为24h表示,因此由于其他的6的倍数,它不会产生误报。

使用基本的grep

grep '0[06] \|1[28] ' file

2017121106 22.9
2017121112 17.2
2017121118 9999.0
2017121200 9999.0
2017121206 16.3
2017121212 8.8
2017121218 10.5

以下awk代码可能会帮助您。

awk '(substr($1,length($1)-1)+0== 06 || substr($1,length($1)-1)+0 == 12 || substr($1,length($1)-1)+0 == 18  || substr($1,length($1)-1)+0 == 00 )'  Input_file

现在也添加非单一衬里形式的解决方案。

awk '
(substr($1,length($1)-1)+0== 06 ||\
substr($1,length($1)-1)+0 == 12 ||\
substr($1,length($1)-1)+0 == 18 ||\
substr($1,length($1)-1)+0 == 00 )
'   Input_file

暂无
暂无

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

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