13

使用 sed 或类似方法,您将如何从文件中提取行?如果我想要文件中的第 1、5、1010、20503 行,我将如何获得这 4 行?

如果我需要提取大量行怎么办?如果我有一个包含 100 行的文件,每行代表一个我想从另一个文件中提取的行号,我该怎么做?

4

6 回答 6

17

类似“sed -n '1p;5p;1010p;20503p'。执行命令“man sed”了解详细信息。

对于您的第二个问题,我会将输入文件转换为一堆 sed(1) 命令来打印我想要的行。

于 2010-01-06T23:09:22.087 回答
6

使用 awk 很简单:

awk 'NR==1 || NR==5 || NR==1010' "file"
于 2010-01-06T23:10:39.173 回答
3

@OP,您可以使用 awk 更轻松、更有效地完成此操作。所以对于你的第一个问题

awk 'NR~/^(1|2|5|1010)$/{print}' file

对于第二个问题

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file
于 2010-01-07T00:41:41.070 回答
1

这不是很漂亮,在某些情况下它可能会超过命令长度限制*

sed -n "$(while read a; do echo "${a}p;"; done < line_num_file)" data_file

或者它更慢但更有吸引力,并且可能更乖巧,兄弟姐妹:

while read a; do echo "${a}p;"; done < line_num_file | xargs -I{} sed -n \{\} data_file

变体:

xargs -a line_num_file -I{} sed -n \{\}p\; data_file

您可以通过添加带有一些大参数(例如 83 或 419 甚至 1177)xarg的选项来稍微加快版本,但 10 似乎与任何版本一样好。-P

*xargs --show-limits </dev/null可能具有指导意义

于 2010-01-07T05:21:39.447 回答
0

在 Perl 中:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
于 2010-03-17T19:27:48.327 回答
0

我会研究 Perl,因为它具有正则表达式工具sed以及围绕它的编程模型,允许您逐行读取文件,计算行数并根据您想要的内容进行提取(包括从行号文件中提取)。

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}
于 2010-01-06T23:08:49.870 回答