1

したがって、keys.txt各キーをリストするファイルがあります(1行に1つ) 。

VIEW_ACCOUNT_NAME_LABEL  
VIEW_ACCOUNT_NAME_DESCR  
VIEW_ACCOUNT_STREET_LABEL  
VIEW_ACCOUNT_CITY_SUBURB_LABEL  
VIEW_ACCOUNT_ZIP_POSTCODE_LABEL  
VIEW_ACCOUNT_COUNTRY_LABEL

そして、キーの値を提供するさまざまな一致する言語ファイルは、次のように、en-GB.view.acccount.ini1 行に 1 つのエントリがあります。

VIEW_ACCOUNT_NAME_LABEL="Name:"
VIEW_ACCOUNT_NAME_DESCR="Name of the account holder."
VIEW_ACCOUNT_STREET_LABEL="Street:"
VIEW_ACCOUNT_CITY_SUBURB_LABEL="City/Suburb:"
VIEW_ACCOUNT_ZIP="Zip Code"
VIEW_ACCOUNT_COUNTRY_LABEL="Country"

多くのキー ファイルと言語ファイルがあり、実際のファイルにはさらに多くのエントリがあり、通常は言語ごとに 1000 以上です。

私は見つけることができる必要があります

  1. 言語ファイルに欠落しているキー (例: VIEW_ACCOUNT_ZIP_POSTCODE_LABEL)
  2. どのキーが言語ファイルにあり、キー ファイルにないか (通常は などの廃止されたキーVIEW_ACCOUNT_ZIP)

最初の要件については、 invert-match オプションを使用grepしてみましたが、結果は期待したものではありません。-v

cppl ~ grep -v --file=keys.txt en-GB.view.acccount.ini
VIEW_ACCOUNT_NAME_LABEL="Name:"
VIEW_ACCOUNT_NAME_DESCR="Name of the account holder."
VIEW_ACCOUNT_STREET_LABEL="Street:"
VIEW_ACCOUNT_CITY_SUBURB_LABEL="City/Suburb:"
VIEW_ACCOUNT_ZIP="Zip Code"
cppl ~ 
4

3 に答える 3

4

を使用しcommます。

言語ファイルから欠落しているキーを見つけるには:

$ comm -23 <(sort keys.txt) <(cut -d= -f1 en-GB.view.acccount.ini | sort) 
VIEW_ACCOUNT_ZIP_POSTCODE_LABEL

言語ファイルには含まれているがキー ファイルには含まれていないキーを見つけるには、次のようにします。

$ comm -13 <(sort keys.txt) <(cut -d= -f1 en-GB.view.acccount.ini | sort)
VIEW_ACCOUNT_ZIP
于 2013-07-02T07:59:20.927 に答える
0

これにperlを使用できますか?もしそうなら、perl はこれをとても簡単にします。これは、私が作成した簡単なスクリプトです。好みに合わせて変更してください。

#!/usr/bin/perl -w

# usage:  validate keys.txt file1.ini [file2.ini [file3.ini [...]]]

open my $keys_file, "<", $ARGV[0] or die "cannot open $ARGV[0] for reading";

my %keys = ( map { chomp; s/\s//g; $_ => 0 } <$keys_file> );

close $keys_file;

sub validate_file
{
    my $filename = shift @_;
    my (@missing, @unexpected, @repeated);
    my %seen = %keys;

    open my $f, "<", $filename or die "cannot open $filename for reading";

    foreach my $line (<$f>)
    {
        chomp $line;

        if ($line =~ /\s*([^=]+)="[^"]*"/)
        {
            if (!defined $seen{$1})
            {
                push @unexpected, $1;
                $seen{$1} = 0;
            }
            $seen{$1}++;
        }
    }

    @missing  = grep { $seen{$_} == 0 } sort keys %keys;
    @repeated = grep { $seen{$_} >  1 } sort keys %keys;

    return \@missing, \@unexpected, \@repeated;
}


shift @ARGV;

foreach my $file (@ARGV)
{
    my ($missing, $unexpected, $repeated) = validate_file($file);

    print "\nFile $file:\n";
    print "Missing keys:\n", join("\n", @$missing), "\n";
    print "Unexpected keys:\n", join("\n", @$unexpected), "\n";
    print "Repeated keys:\n", join("\n", @$repeated), "\n";
}
于 2013-07-02T08:02:36.147 に答える
0

これを行うには、標準の UNIX ユーティリティjoinを使用できますuniq。これを行う1つの方法を次に示します。

file1次の例では、キー ファイルの名前が付けられていると仮定します。

値ではなく、キーのみを含むファイルを生成します。

sed 's/=.*//' en-GB.view.acccount.ini > file2

これで、キーだけがfile1含まfile2れています。この例では:

$ cat file1
A
B
C
D

$ cat file2
C
D
E

と の組み合わせを使用してjoin、目的の出力を取得できるようにsortなりました。uniq

# Keys which are common to both files.
$ join file1 file2 | cat - file1 | sort | uniq -d
C
D

# Keys in file1 but not in file2
$ join file1 file2 | cat - file1 | sort | uniq -u
A
B

# Keys in file2 but not in file1
$ join file1 file2 | cat - file2 | sort | uniq -u
E
于 2013-07-02T07:57:31.317 に答える