1

我有一个大文件,其中包含不同制表符分隔数据的表格。不同的表由空行分隔。

我有一个特定表开始的行号,我需要检索整个表。

如何使用 grep (或类似的东西)在特定行号之后获取下一个空白行的行号?

4

4 回答 4

4

用于sed此,这应该可以解决问题:

sed -n '1,/^\s*$/p' file

只需替换逗号前的第一个数字,在本例1中为行号,演示从给定的行号打印每个表:

$ cat file
one
two
three

five
six
seven

nine
ten
eleven

$ sed -n '1,/^\s*$/p' file
one
two
three

$ sed -n '5,/^\s*$/p' file
five
six
seven

$ sed -n '9,/^\s*$/p' file
nine
ten
eleven

使用-n选项来关闭每一行的默认打印,并且p标志sed从行号打印到与正则表达式匹配的第一行,其中:

^     # Matches the start of the line
\s*   # Matches zero or more whitespace characters
$     # Matches the end of the line

使用sed -n 'A,Bp'whereAB可以是行号或正则表达式的格式,您可以轻松地打印文件的子部分。

用 do 只打印下一个空行的行号sed

$ sed -n '1,/^\s*$/{=}' file | tail -1
4

$ sed -n '5,/^\s*$/{=}' file | tail -1
8

$ sed -n '9,/^\s*$/{=}' file | tail -1
12

或者只是打印所有空白行的位置

$ sed -n '/^\s*$/{=}' file
4
8
12

获取下一个空白行号awk不需要使用tail

$ awk 'NR>=1 && /^\s*$/{print NR;exit}' file
4

$ awk 'NR>=5 && /^\s*$/{print NR;exit}' file
8

$ awk 'NR>=9 && /^\s*$/{print NR;exit}' file
12

$ awk '/^\s*$/{print NR}' file
4
8
12

如果它让您更清楚,您可以awk使用 using传递一个变量-v

$ awk -v start=1 'NR>=start && /^\s*$/{print NR;exit}' file
4

$ awk -v start=5 'NR>=start && /^\s*$/{print NR;exit}' file
8

$ awk -v start=9 'NR>=start && /^\s*$/{print NR;exit}' file
12
于 2013-01-11T10:05:57.907 回答
2

Perl 使这变得简单。要将第 31 行中的所有行提取到some_file中的下一个空白行:

$ perl -wne 'print if 31 .. /^$/' some_file
于 2013-01-11T12:14:24.807 回答
0

使用 awk 的一种方法:

awk -vs=$sta '{ok=NR>=s}ok&&!$0{exit;}ok&&$0'

$sta是一个变量,它存储起始行号。如果我们用起始行 nr=5 的 sudo_O 的输入示例进行测试,它看起来像:

kent$  sta=5

kent$  echo "1
2
3

5
6
7

9
10
11"|awk -vs=$sta '{ok=NR>=s}ok&&!$0{exit;}ok&&$0'
5
6
7

注意 sed 的地址会包含边界,也就是说,目标表后面的空行也会被打印出来。这个 awk one-liner 不会打印它。好吧,这取决于您想要输出的内容。

编辑以防您只想获取下一个空行号

awk -vs=$sta 'NR>=s&&!$0{print NR;exit;}' file
于 2013-01-11T10:25:45.823 回答
0

在下面的命令中,5 是您已知的表行号

perl -lne 'exit if(/^$/ && $.>5);if($.>=5){print}' your_file
于 2013-01-11T10:43:50.367 回答