我有一个巨大的文件,我有兴趣检索几个值(长数字)。大多数情况下,数字从行尾开始,一直持续到下一行的开头,grep无法全部检索。
例如,我的数字采用以下格式:-1234.1234567
所以当我使用
grep -Eo '-[0-9]{4}.[0-9]{7}'
它不会返回所有值,因为有时数字会这样:
blah blah blah ....-1234.12
34567 blah blah blah
那么,有没有办法告诉grep继续查找(如果需要)到下一行来检索该数字的所有7位小数?
由于
答案 0 :(得分:0)
你应该能够删除水平空格,然后预先形成你的grep。
尝试:cat myfile | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'
如果你想对目录中的所有文件执行此操作,只需使用for循环:
for i in *; do cat $i | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'; done
答案 1 :(得分:0)
这将按照您的要求执行(将GNU awk用于ENDFILE):
gawk -v OFS=': ' '
{ rec = rec $0 }
ENDFILE {
while ( match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/) ) {
print FILENAME, substr(rec,RSTART,RLENGTH)
rec = substr(rec,RSTART+RLENGTH)
}
rec = ""
}
' *
例如:
$ cat file1
blah blah blah ....-1234.12
34567 blah blah blah
blah blah blah ....-2345.2345
678 blah blah blah
$ cat file2
blah blah blah ....-4321.12
34567 blah blah blah
blah blah blah ....-9876.2345
678 blah blah blah
$ gawk -v OFS=': ' '
{ rec = rec $0 }
ENDFILE {
while ( match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/) ) {
print FILENAME, substr(rec,RSTART,RLENGTH)
rec = substr(rec,RSTART+RLENGTH)
}
rec = ""
}
' file1 file2
file1: -1234.1234567
file1: -2345.2345678
file2: -4321.1234567
file2: -9876.2345678
尝试使用一些真实的示例输入,其中包括以8位数而不是7位结尾的字符串边缘情况,并让我们知道任何其他要求。
如果你没有GNU awk,你可以对FNR == 1和END时调用match()的函数做同样的事情。还有各种各样的选择......