4
A
回答
3
假設行號要打印的排序。
open my $fh, '<', 'line_numbers' or die $!;
my @ln = <$fh>;
open my $tx, '<', 'text_file' or die $!;
foreach my $ln (@ln) {
my $line;
do {
$line = <$tx>;
} until $. == $ln and defined $line;
print $line if defined $line;
}
0
我不會和大文件做這種方式,但(未經測試):
open(my $fh1, "<", "line_number_file.txt") or die "Err: $!";
chomp(my @line_numbers = <$fh1>);
$_-- for @line_numbers;
close $fh1;
open(my $fh2, "<", "text_file.txt") or die "Err: $!";
my @lines = <$fh2>;
print @lines[@line_numbers];
close $fh2;
3
0
我會做這樣的:
#!/bin/bash
numbersfile=numbers
datafile=data
while read lineno < $numbersfile; do
sed -n "${lineno}p" datafile
done
下行到我的做法是,將產生大量的流程,這樣它會比其他選擇更慢。儘管它可讀性更高。
2
只需在基本while(<>)
塊的上下文內使用eof
,就可以避免其他一些答案(對排序行的要求)的限制。這會告訴你何時停止讀取行號並開始讀取數據。請注意,您需要在發生切換時重置$.
。
# Usage: perl script.pl LINE_NUMS_FILE DATA_FILE
use strict;
use warnings;
my %keep;
my $reading_line_nums = 1;
while (<>){
if ($reading_line_nums){
chomp;
$keep{$_} = 1;
$reading_line_nums = $. = 0 if eof;
}
else {
print if exists $keep{$.};
}
}
0
這是使用bash短溶液和sed
sed -n -e "$(cat num |sed 's/$/p/')" file
其中num是數字的文件和文件(測試OS/X雪豹)輸入文件
$ cat num
1
3
5
$ cat file
Line One
Line Two
Line Three
Line Four
Line Five
$ sed -n -e "$(cat num |sed 's/$/p/')" file
Line One
Line Three
Line Five
1
0
$ cat input every good bird does fly $ cat lines 2 4 $ perl -ne 'BEGIN{($a,$b) = `cat lines`} print if $.==$a .. $.==$b' input good bird does
如果這是太多了一行代碼,使用
#! /usr/bin/perl
use warnings;
use strict;
sub start_stop {
my($path) = @_;
open my $fh, "<", $path
or die "$0: open $path: $!";
local $/;
return ($1,$2) if <$fh> =~ /\s*(\d+)\s*(\d+)/;
die "$0: $path: could not find start and stop line numbers";
}
my($start,$stop) = start_stop "lines";
while (<>) {
print if $. == $start .. $. == $stop;
}
Perl的魔力開放允許創新的可能性,如
$ ./lines-between 'tac lines-between|' print if $. == $start .. $. == $stop; while (<>) {
1
這裏是一個辦法做到這一點在Perl沒有slurpin克任何從而程序的內存佔用量是獨立於文件的大小的(但是它假定要被打印的行號被排序):
#!/usr/bin/perl
use strict; use warnings;
use autodie;
@ARGV == 2
or die "Supply src_file and filter_file as arguments\n";
my ($src_file, $filter_file) = @ARGV;
open my $src_h, '<', $src_file;
open my $filter_h, '<', $filter_file;
my $to_print = <$filter_h>;
while (my $src_line = <$src_h>) {
last unless defined $to_print;
if ($. == $to_print) {
print $src_line;
$to_print = <$filter_h>;
}
}
close $filter_h;
close $src_h;
生成源文件:
C:\> perl -le "print for aa .. zz" > src
生成過濾器文件:
C:\> perl -le "print for grep { rand > 0.75 } 1 .. 52" > filter
C:\> cat filter 4 6 10 12 13 19 23 24 28 44 49 50
輸出:
C:\> f src filter ad af aj al am as aw ax bb br bw bx
爲了對付一個未排序的過濾器文件,你可以修改while
循環:
while (my $src_line = <$src_h>) {
last unless defined $to_print;
if ($. > $to_print) {
seek $src_h, 0, 0;
$. = 0;
}
if ($. == $to_print) {
print $src_line;
$to_print = <$filter_h>;
}
}
如果過濾器文件的內容是相當隨機的,因爲它會保持復卷這會浪費大量的時間到源文件的開頭。在這種情況下,我會建議使用Tie::File。
0
這裏是一個辦法做到這一點使用Tie::File:
#!/usr/bin/perl
use strict; use warnings;
use autodie;
use Tie::File;
@ARGV == 2
or die "Supply src_file and filter_file as arguments\n";
my ($src_file, $filter_file) = @ARGV;
tie my @source, 'Tie::File', $src_file, autochomp => 0
or die "Cannot tie source '$src_file': $!";
open my $filter_h, '<', $filter_file;
while (my $to_print = <$filter_h>) {
print $source[$to_print - 1];
}
close $filter_h;
untie @source;
相關問題
- 1. 如何使用python在文本文件中打印特定行
- 2. 如何在Python中打印文件的特定行?
- 3. 如何在特定行中打印QString
- 4. 如何使用文件中的特定行並在Python中進行打印
- 5. 在新文件中打印文本文檔的特定行
- 6. 如何打印特定單詞在文本文件中的Java
- 7. 在Windows批處理中打印文本文件的特定行
- 8. UNIX替換文件中的特定行
- 9. 如何從unix中的文件中刪除特定的行?
- 10. 如何遞歸地在unix中打印文件的列?
- 11. 如何在unix中的特定行之後插入文本行到文件中
- 12. 如何使用unix以行方式打印特定列?
- 13. 如何將文件打印到特定的打印機
- 14. 在Windows cmd中打印文件的特定行
- 15. 閱讀文件,並在Python中打印它的特定行
- 16. 搜索特定字段並將它們打印到unix中的新文件中
- 17. 如何打印從文本文件的特定行用C
- 18. 如何打印文本文件的特定行?
- 19. 在Unix中打印3個文件所需的行
- 20. 用於從特定號碼打印文件的Unix命令
- 21. 將文件打印到java中的特定打印機
- 22. 無法打印從文本文件中的特定行
- 23. 打印特定行txt文件python
- 24. 如何在linux/unix中的文件中的特定行中刪除逗號
- 25. 如何從tkinter多行文本小部件打印特定行
- 26. 打印從Unix文件
- 27. 在python中打印特定行?
- 28. 如何打印出包含unix中特定字符串的文件的所有行
- 29. 打印大文件中的選定行
- 30. Java:如何比較CSV文件的列和打印特定行
這將是很容易在Python中,如果你也接受這種語言。 – 2010-07-23 15:19:08