使用 sed 或类似方法,您将如何从文件中提取行?如果我想要文件中的第 1、5、1010、20503 行,我将如何获得这 4 行?
如果我需要提取大量行怎么办?如果我有一个包含 100 行的文件,每行代表一个我想从另一个文件中提取的行号,我该怎么做?
使用 sed 或类似方法,您将如何从文件中提取行?如果我想要文件中的第 1、5、1010、20503 行,我将如何获得这 4 行?
如果我需要提取大量行怎么办?如果我有一个包含 100 行的文件,每行代表一个我想从另一个文件中提取的行号,我该怎么做?
类似“sed -n '1p;5p;1010p;20503p'。执行命令“man sed”了解详细信息。
对于您的第二个问题,我会将输入文件转换为一堆 sed(1) 命令来打印我想要的行。
使用 awk 很简单:
awk 'NR==1 || NR==5 || NR==1010' "file"
@OP,您可以使用 awk 更轻松、更有效地完成此操作。所以对于你的第一个问题
awk 'NR~/^(1|2|5|1010)$/{print}' file
对于第二个问题
awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file
这不是很漂亮,在某些情况下它可能会超过命令长度限制*:
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
可能具有指导意义
在 Perl 中:
perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
我会研究 Perl,因为它具有正则表达式工具sed
以及围绕它的编程模型,允许您逐行读取文件,计算行数并根据您想要的内容进行提取(包括从行号文件中提取)。
my $row = 1
while (<STDIN>) {
# capture the line in $_ and check $row against a suitable list.
$row++;
}