如何使用unix上的行号从文件中提取行?

时间:2010-01-06 23:06:03

标签: unix sed awk line-numbers text-extraction

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

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

6 个答案:

答案 0 :(得分:15)

像“sed -n'1p; 5p; 1010p; 20503p'之类的东西。执行命令”man sed“了解详情。

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

答案 1 :(得分:5)

用awk就这么简单:

awk 'NR==1 || NR==5 || NR==1010' "file"

答案 2 :(得分:2)

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

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

第二个问题

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file

答案 3 :(得分:0)

我会调查Perl,因为它具有sed的正则表达式设施以及围绕它的编程模型,允许您逐行读取文件,计算行数并根据您的需要提取(包括来自行号文件。)

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}

答案 4 :(得分:0)

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

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

你可以通过添加xarg选项和一些大的参数来加速-P版本,例如83或419甚至1177,但10似乎和任何一样好。

* xargs --show-limits </dev/null可以是有益的

答案 5 :(得分:0)

Perl:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file