Perl Linux-查找给定行中的内容

Perl Linux-查找给定行中的内容,perl,sed,awk,grep,Perl,Sed,Awk,Grep,我有几个通用格式的文本文件 0 0 0 0 125 0 0 0 0 0 0 3211 0 0 0 0 首先,我想确定file1.txt中的哪些行包含非零元素 grep -ne '^[1-9]' file1.txt | cut -f 1 d: 然后,我想在file1.txt、file2.txt和file3.txt中循环这些行号,并将找到的行号粘贴到新文件中,格式为。每个文本文件每行有一个数字,尽管偶尔的行只有一个换行符 file1 file2 file3 125 a num

我有几个通用格式的文本文件

0
0
0
0
125
0
0
0
0
0
0
3211
0
0

0
0
首先,我想确定file1.txt中的哪些行包含非零元素

grep -ne '^[1-9]' file1.txt | cut -f 1 d:
然后,我想在file1.txt、file2.txt和file3.txt中循环这些行号,并将找到的行号粘贴到新文件中,格式为。每个文本文件每行有一个数字,尽管偶尔的行只有一个换行符

file1  file2   file3
125    a num   a num
3211   a num   a num
我将使用“粘贴”命令将每个结果附加到新的文本文件中。但是,我不确定如何对特定行号的内容进行grep。如有任何帮助,我们将不胜感激

$ paste -d "  " f1 f2 f3 | grep -v "^0 "
1 101 201
3 103 203
11 111 211
Perl:

$ cat script.pl
open(my $f1, "<", "f1")||die $!; 
open(my $f2, "<", "f2")||die $!; open(my $f3, "<", "f3")||die $!;
while (my $line1=<$f1>) {
    chomp $line1; 
    my $line2 = <$f2>; chomp $line2; my $line3 = <$f3>; chomp $line3;
    next if $line1 =~ /^0*$/;
    print "$line1 $line2 $line3\n"
}
$ perl script.pl
1 101 201
3 103 203
11 111 211
$ cat f1
0
0
1
0
3
0
11
$ cat f2
0
0
101
0
103
0
111
$ cat f3
0
0
201
0
203
0
211

您可能对这个Perl版本感兴趣

use strict;
use warnings;

use Tie::File;

my @rows;
my @i;
my @files = qw/ file1.txt file2.txt file3.txt /;

for my $file (@files) {
  tie my @file, 'Tie::File', $file or die qq{Couldn't open file "$file": $!};
  my @i = grep $file[$_], 0 .. $#file unless @i;
  my @column = @file[@i];
  push @{$rows[$_]}, $column[$_] for 0 .. $#column;
}

print join("\t", @files), "\n";
print join("\t", @{$rows[$_]}), "\n" for 0 .. $#rows;