我有一个由空格分隔符和两列组成的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
在终端中运行此代码时,我收到一个空的回复。
我做错了什么?
答案 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