他のテキストファイルのデータをシェルのファイルと比較して印刷します。

他のテキストファイルのデータをシェルのファイルと比較して印刷します。

Shellでさまざまなテキストファイルのデータを比較して印刷する方法。

私は以下を使用してNAS3つの異なるボックスの詳細をキャプチャしました。SSHマウント名同じ場合は、最初の列にする必要があります。3つのボックスに存在する場合は、同じ行に印刷する必要があります。のみ表示されますBOX_BそしてBOX_Cそれからマウント名最初の列に表示する必要があります。ボックス_A空にする必要があります

2つの例を見てみましょう。df_BoxA.txtそしてdf_BoxB.txtそしてdf_BoxC.txt

例:

$cat df_BoxA.txt  
/logs/boxA      2G     1.2G     7.7G    62%             NAS:/logs/boxA
/data/boxA      2G     1.8G     2.0G    91%             NAS:/data/boxA 
/apps/boxA      2G     1.4G     5.7G    72%             NAS:/apps/boxA 
/data/java      1G     67M      9.3G    7%              NAS:/data/java
/home/admin     10G    4.6G     54G     46%             NAS:/home/admin
/admin/arch     10G    8.3G     19G     83%             NAS:/admin/arch
/apps/dist      10G    8.3G     19G     83%             NAS:/apps/dist



$cat df_BoxB.txt  
/logs/boxA      2G     1.2G     7.7G    62%             NAS:/logs/boxB
/data/boxA      2G     1.8G     2.0G    91%             NAS:/data/boxB 
/apps/boxA      2G     1.4G     5.7G    72%             NAS:/apps/boxB 
/home/user      40G    29.3G    107G    74%             NAS:/home/user1 
/data/java      1G     67M      9.3G    7%              NAS:/data/java
/home/admin     10G    4.6G     54G     46%             NAS:/home/admin
/apps/dist      10G    8.3G     19G     83%             NAS:/apps/dist


$cat df_BoxC.txt  
/logs/boxA      2G     1.2G     7.7G    62%             NAS:/logs/boxC
/data/boxA      2G     1.8G     2.0G    91%             NAS:/data/boxC 
/apps/boxA      2G     1.4G     5.7G    72%             NAS:/apps/boxC 
/home/user1     40G    29.3G    107G    74%             NAS:/home/user1 
/home/admin     10G    4.6G     54G     46%             NAS:/home/admin
/admin/arch     10G    8.3G     19G     83%             NAS:/admin/arch
/apps/dist      10G    8.3G     19G     83%             NAS:/apps/dist

3つのファイルをすべてマージした後、結果は次のようになります。

$cat result.txt 
/logs/boxA   2G     1.2G     7.7G    62% NAS:/logs/boxA 2G  1.2G  7.7G  62% NAS:/logs/boxB  2G   1.2G  7.7G  62% NAS:/logs/boxC
/data/boxA   2G     1.8G     2.0G    91% NAS:/data/boxA 2G  1.8G  2.0G  91% NAS:/data/boxB  2G   1.8G  2.0G  91% NAS:/data/boxC
/apps/boxA   2G     1.4G     5.7G    72% NAS:/apps/boxA 2G  1.4G  5.7G  72% NAS:/apps/boxB  2G   1.4G  5.7G  72% NAS:/apps/boxC 
/data/java   1G     67M     9.3G    7%   NAS:/data/java 1G  67M   9.3G  7%  NAS:/data/java
/home/admin  10G    4.6G     54G     46% NAS:/home/admin10G 4.6G  54G   46% NAS:/home/admin 10G  4.6G  54G   46% NAS:/home/admin
/admin/arch  10G    8.3G     19G     83% NAS:/admin/arch                                    10G  8.3G  19G   83% NAS:/admin/arch
/apps/dist   10G    8.3G     19G     83% NAS:/apps/dist 10G 8.3G  19G   83% NAS:/apps/dist  10G  8.3G  19G   83% NAS:/apps/dist
/home/user                                              40G 29.3G 107G  74% NAS:/home/user1 
/home/user1                                                                                 40G  29.3G 107G  74% NAS:/home/user1

コマンドを使用してファイルを結合してみましたが、それはpr望む結果ではありません。

また試してみましたsdiffが、結果は得られませんでした。

この問題をどのように解決できますか?

ベストアンサー1

実行したい操作には少しプログラミングが必要です。

#!/usr/bin/perl
# Program to join files of TAB separated data based on first key
# --J. Ziobro--: 11/2014
use strict;
my $f;
my %allLines;
my $maxColumns = 0;
my $fileNum    = 0;
my %keys;
foreach $f (@ARGV) {
    die "Could not open $f" unless open( F, $f );
    while (<F>) {
        chop;
        my ( $key, @line ) = split /\t/;    # assume tab separate all cols
        $maxColumns = ( $maxColumns > @line ) ? $maxColumns : @line;

        # allLines is indexed by KEY <tab> FileNumber
        $keys{$key} = 1;
        $allLines{ $key . "\t" . $fileNum } = join( "\t", @line );
    }
    $fileNum++;
}
foreach ( keys %keys ) {
    print $_;
    for ( $f = 0 ; $f < $fileNum ; $f++ ) {
        if ( exists $allLines{ $_ . "\t" . $f } ) {
            print "\t", $allLines{ $_ . "\t" . $f };
        }
        else {
            print "     " x $maxColumns;
        }
    }
    print "\n";
}

さようなら、 //Z\

おすすめ記事