我想从大文件中选择大量的特定行。
使用perl,我创建了一个这种样式的命令(此处打印第2行和第4行):
sed -n -e 2p -e 4p $file并使用system()命令启动它。
这很好,除非要从文件中选择的行数变得相当大。它目前适用于10,000行,但不适用于我希望选择17,000行的另一个文件。可以传递给sed的参数数量是否有限制?是否有其他UNIX工具可供使用?谢谢你的帮忙
发布于 2014-10-31 10:35:31
其中一个sed命令:
使用;分隔符而不是几个-e 2p
sed -n -e '2p;4p;12p' file如果对bash命令行来说太长
在2p;4p;12p中创建一个具有相同结构的临时文件,并使用-f选项
sed -n -f TemporaryFile file发布于 2014-10-31 10:05:58
您肯定在文件中的某个位置有您想要的行列表,所以让我们假设该文件名为lines.txt,如下所示:
1
2
4
7现在,你可以这样做:
awk 'FNR==NR{wanted[$0]++;next} FNR in wanted' lines.txt file上面写着..。FNR==NR意味着第一组大括号仅适用于lines.txt文件的处理,在处理该文件时,将所需的行号存储在数组wanted[]中,然后移到下一行。第二部分,FNR in wanted适用于第二个文件file的处理。它说,如果行号(FNR)位于数组wanted[]中,则打印该行。
发布于 2014-10-31 09:05:02
这不是sed限制,而是bash命令行长度限制:它是getconf ARG_MAX字节最大值(在Linux上,我看到了这个值的值从131072到2621440)。
勒内·尼芬格格的评论是明智的:在*NIX世界里,Perl是解决这类问题的更好选择。
如果您描述需要如何选择要提取的行(即:从i到j?或者一个特定行的列表?,一些不同的逻辑?),应该很容易给您一个代码示例.
更新:下面的给出了第一个用例的示例。当然,如果您给出了一些用例的例子,如果可以找到一个模式,那么应该很容易简化第二个更通用的用例的解决方案.
#!/usr/bin/perl
#
# Print a range of lines from a text file.
# Usage: extract-a-range-of-lines.pl first-line last-line input-file
# use ARGV to verify the number of perl command line arguments
@ARGV == 3 or die "Usage: $0 first-line last-line input-file\n";
my ($first_line, $last_line, $filename) = @ARGV;
open(my $FILE, "<", $filename) or die "Could not read from $filename ($!)"; # open the input file   
# loop through the input file
my $count = 1;
while (<$FILE>) {
  last if ($count > $last_line); # break loop when you get to the last line   
  print $_ if ($count >= $first_line); # print the current line if the line number is greater than first param
  $count++; # increment the line counter
}
close $FILE; # close input filehttps://stackoverflow.com/questions/26670650
复制相似问题