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

如何在unix上使用行号从文件中提取行?,unix,sed,awk,line-numbers,text-extraction,Unix,Sed,Awk,Line Numbers,Text Extraction,使用sed或类似工具,如何从文件中提取行?如果我想要文件中的第1行、第5行、第1010行、第20503行,我将如何获得这4行 如果有相当多的行需要提取,该怎么办? 如果我有一个有100行的文件,每行代表我想从另一个文件中提取的行号,我该如何做呢?我会研究Perl,因为它有sed的regexp功能,加上围绕它的编程模型,允许您逐行读取文件,计算行数并根据需要提取(包括从行号文件中提取) my$row=1 而(){ #捕获$中的行,并对照适当的列表检查$行。 $row++; } 类似于“sed-n'

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

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

我会研究Perl,因为它有sed的regexp功能,加上围绕它的编程模型,允许您逐行读取文件,计算行数并根据需要提取(包括从行号文件中提取)

my$row=1
而(){
#捕获$中的行,并对照适当的列表检查$行。
$row++;
}
类似于“sed-n'1p;5p;1010p;20503p”的命令。有关详细信息,请执行命令“mansed”


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

使用awk,它非常简单:

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

@哦,你可以用awk更容易、更有效地完成这项工作。所以,关于你的第一个问题

awk 'NR~/^(1|2|5|1010)$/{print}' file
第二项质询

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

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

通过添加带有一些大参数的
-p
选项,例如83或419甚至1177,可以稍微加快
xarg
版本的速度,但是10似乎与任何一个都一样好

*
xargs——在Perl中显示限制:

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

+1,要查找答案的第二部分是
sed-f
sed-n'1p;5p;1010p;20503p inputFile.txt>outputFile.txt
,您可以在命令提示符下使用perl-e'perlcode here'。perl还有一个范围运算符..如3..12所示,它允许您在需要的地方创建一个数字列表。您应该使用
 $。
,自动包含当前行number@Hasturkun-我不知道!谢谢。任何对Perl命令行技术感兴趣的人都可能想看看Minimal Perl,来自Manning…@michael,胡说,awk也可以这么做。ennuikiller,是的,我主要是评论+1在这个上下文中使用awk,ghostdog74,Perl也可以,python、pure bash等。对于这项工作的正确工具,这是一个意见问题。第二个回答有点模糊。解释一下:
FNR==NR
只会在使用linenr
读取
file\u时发生,而不是
file
。在这种情况下,该行的文本被添加到set
a
,执行跳转到inp的下一行ut.因此,当从
文件
读取时,只有
(a中的FNR)
案例适用,并且在解析
文件时,如果相关行的编号被放入
a
,则打印相关行的文本。
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
perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file