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

时间:2017-12-11 14:39:30

标签: regex linux bash unix grep

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

我需要interface IKeys { key1: string; key2: string } array.map(val => <IKeys>{ key1: val.key1, key2: val.key2 }); 第一列中以 06,12,18或00 结尾的所有行。

file.txt的

grep

尝试过的代码:

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

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

我做错了什么?

4 个答案:

答案 0 :(得分:4)

所以...... grep命令不理解“字段”。它只了解模式。由于您的“第一列”是数字后跟空格的模式,因此您匹配 而不是使用$

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

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

更好的解决方案可能是使用awk,其中 了解字段:

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

答案 1 :(得分:3)

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的倍数而产生误报。

答案 2 :(得分:2)

使用基本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

答案 3 :(得分:1)

关注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