繁体   English   中英

grep:如何查找表达式之间的所有线

[英]grep: how to find ALL the lines between to expressions

我们有一个巨大的文件(数字),我们想获取两个表达式之间的所有行,例如,

232445 -9998.01 xxxxxxxxxx

234566 -9998.02 xxxxxxxxx

.

.

324444 -8000.012 xxxxxxx

344444 -8000.0 xxxx

表达式为-9998.01-8000.0 ,因此尝试:

$ grep -A100000 '[0-9] -9998.[0-9]' mf.in | grep -B100000 '[0-9] -8000.[0-9]' mf.in > mfile.out

没关系...之间的所有线都可以得到...当然,100000太大了以至于无法保持所有的线...但是如果我们错了? 即,如果有超过100000之间? 在A和B之后如何在没有数字说明的情况下取所有之间的...

PD:我无法将sed与类似的“ [...]”表达式一起使用

PD2:列中的位数更多(此处只有4列)

-1931076.0 -9998.96235 1.0002741998076021 0.0191476198569163

-1931075.0 -9998.95962 1.0000742544770280 0.0192495084654059

-1931074.0 -9998.95688 0.9998778097258081 0.0193725608470694

awk

awk '$2 ~ /^-9998.01$/{p=1} p{print} $2 ~ /^-8000.0$/{p=0}' file

测试:

$ cat file 
232445 -9998.00 xxxxxxxxxx
232445 -9998.01 xxxxxxxxxx
234566 -9998.02 xxxxxxxxx
234566 -9998.03 xxxxxxxxx
234566 -9998.05 xxxxxxxxx
....
....
324444 -8000.011 xxxxxxx
324444 -8000.012 xxxxxxx
344444 -8000.0 xxxx
344444 -8000.1 xxxx

$ awk '$2 ~ /^-9998.01$/{p=1} p{print} $2 ~ /^-8000.0$/{p=0}' file 
232445 -9998.01 xxxxxxxxxx
234566 -9998.02 xxxxxxxxx
234566 -9998.03 xxxxxxxxx
234566 -9998.05 xxxxxxxxx
....
....
324444 -8000.011 xxxxxxx
324444 -8000.012 xxxxxxx
344444 -8000.0 xxxx

好吧,这可能不是最佳答案,但是对您的命令而言,最简单的解决方法是将文件的行数用作-A-B参数,因此您可以确保不会错过任何行:

NB_LINES=$(wc -l main.c | awk '{print $1}')
grep -A$NB_LINES '[0-9] -9998.[0-9]' mf.in | grep -B$NB_LINES '[0-9] -8000.[0-9]' mf.in > mfile.out

虽然,在纯壳中,我很有可能会做类似的事情。 或者我写一个小的python脚本,看起来像:

import re
LINE_RE = re.compile(r'[^ ]+ (-[0-9]+\.[0-9]+) .*')
with open('mf.in', 'r') as fin:
    with open('mf.out', 'w') as fout:
        for line in f:
            match = LINE_RE.match(line)
            if match:
                if float(match.groups()[0]) > -9998.0:
                    fout.write(line)
                elif float(match.groups()[0]) < -8000.0:
                    break

注意: 此脚本只是为了展示算法思想,并且经过盲目编码和未经测试,可能需要进行一些调整才能真正起作用

高温超导

sed已使用以下表达式内置了此功能:

/regex1/,/regex2/ p => p命令打印出两行之间的所有行(起始行具有regex1 ,结束行具有regex2 (在输出中均包括)。

这是文件格式的示例:

$ cat file
124235 -69768.77 xxx
232445 -9998.01 xxxxxxxxxx
234566 -9998.02 xxxxxxxxx
12345 -124.66 xxxx
324444 -8000.012 xxxxxxx
344444 -8000.0 xxxx
344444 -7000.0 xxxx

$ sed -nr '/^[0-9]+\s-9998.[0-9]+\s/,/^[0-9]+\s-8000.[0-9]+\s/ p' file
232445 -9998.01 xxxxxxxxxx
234566 -9998.02 xxxxxxxxx
12345 -124.66 xxxx
324444 -8000.012 xxxxxxx
344444 -8000.0 xxxx
$

暂无
暂无

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

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