使用sed或类似方法如何从文件中提取行?如果我想从文件中获取第1,5,1010,20503行,我将如何获得这4行?
如果我需要提取相当多的行,该怎么办? 如果我有一个包含100行的文件,每行代表一个我想从另一个文件中提取的行号,我该怎么做?
答案 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