1

我正在进行目录清理以检查未在我们的测试环境中使用的文件。我有一个所有文件名的列表,这些文件名在一个文本文件和另一个我想要比较的文件中按字母顺序排序。

这是第一个文件的设置方式:

test1.pl
test2.pl
test3.pl

这是一个简单的脚本名称,每行文本文件的一个脚本名称是我要根据下面的另一个文件清理的目录中的所有脚本。

我要比较的文件是一个选项卡文件,其中列出了每个服务器作为测试运行的脚本,并且显然有很多重复项。我想从这个文件中去掉测试脚本的名称,并将它与另一个文件比较,使用uniqsort这样我就可以diff用上面的这个文件来查看哪些测试脚本没有被使用。

该文件设置如下:

server: : test1.pl test2.pl test3.pl test4.sh test5.sh

有些行少,有些行多。我的第一个冲动是制作一个Perl脚本来拆分行并将值推送到列表中(如果它们不存在),但这似乎完全低效。我没有经验,awk但我认为有不止一种方法可以做到这一点。比较这些文件的任何其他想法?

4

5 回答 5

2

A Perl solution that makes a %needed hash of the files being used by the servers and then checks against the file containing all the file names.

#!/usr/bin/perl
use strict;
use warnings;
use Inline::Files;

my %needed;
while (<SERVTEST>) {
    chomp;
    my (undef, @files) = split /\t/;
    @needed{ @files } = (1) x @files;
}

while (<TESTFILES>) {
    chomp;
    if (not $needed{$_}) {
        print "Not needed: $_\n";   
    }
}

__TESTFILES__
test1.pl
test2.pl
test3.pl
test4.pl
test5.pl
__SERVTEST__
server1::   test1.pl    test3.pl
server2::   test2.pl    test3.pl
__END__
*** prints

C:\Old_Data\perlp>perl t7.pl
Not needed: test4.pl
Not needed: test5.pl
于 2012-10-31T19:39:53.847 回答
2

这通过 将文件名重新排列为第二个文件中的每行一个awk,然后diff与第一个文件一起输出。

diff file1 <(awk '{ for (i=3; i<=NF; i++) print $i }' file2 | sort -u)
于 2012-10-31T19:32:53.190 回答
1

快速而肮脏的脚本来完成这项工作。如果听起来不错,请使用 open 来读取文件并进行适当的错误检查。

use strict;
use warnings;
my @server_lines = `cat server_file`;chomp(@server_lines);
my @test_file_lines = `cat test_file_lines`;chomp(@test_file_lines);
foreach my $server_line (@server_lines){
   $server_line =~ s!server: : !!is;
   my @files_to_check = split(/\s+/is, $server_line);
   foreach my $file_to_check (@files_to_check){
      my @found = grep { /$file_to_check/ } @test_file_lines;
      if (scalar(@found)==0){
        print "$file_to_check is not found in $server_line\n";
      }
   }

}

于 2012-10-31T17:26:35.483 回答
1

如果我正确理解您的需求,您有一个包含测试列表的文件(testfiles.txt):

test1.pl
test2.pl 
test3.pl
test4.pl
test5.pl

还有一个包含服务器列表的文件,其中包含所有测试的文件(serverlist.txt):

server1:        :       test1.pl        test3.pl
server2:        :       test2.pl        test3.pl

(我假设所有空格都是制表符)。

如果您将第二个文件转换为经过测试的文件列表,则可以将其diff与原始文件进行比较。

cut -d: -f3 serverlist.txt | sed -e 's/^\t//g' | tr '\t' '\n' | sort -u > tested_files.txt

cut删除服务器名称和“:”,删除sed留下的前导选项卡,tr然后将剩余的选项卡转换为换行符,然后我们进行唯一排序以排序和删除重复项。这是输出到tested_files.txt.

然后你要做的就是diff testfiles.txt tested_files.txt

于 2012-10-31T17:39:48.670 回答
0

很难说,因为您没有发布预期的输出,但这是您要找的吗?

$ cat file1
test1.pl
test2.pl
test3.pl
$
$ cat file2
server: : test1.pl test2.pl test3.pl test4.sh test5.sh
$
$ gawk -v RS='[[:space:]]+' 'NR==FNR{f[$0]++;next} FNR>2 && !f[$0]' file1 file2
test4.sh
test5.sh
于 2012-11-01T03:54:59.653 回答