Compare e imprima dados de diferentes arquivos de texto para um no Shell

1

Como posso comparar e imprimir dados de diferentes arquivos de texto em um no Shell.

Capturei NAS detalhes de três caixas diferentes usando SSH , agora preciso combinar todos os três arquivos de texto em um arquivo e NOME DE MONTAGEM deve estar na primeira coluna e se o mesmo MOUNT estava presente nas três caixas, então deveria ser impresso na mesma linha e se o MOUNT fosse apresentado apenas em BOX_B e BOX_C então nome do MOUNT deve ser apresentado na primeira coluna e Coluna do Box_A deve ser mantido em branco

Vamos pegar dois exemplos df_BoxA.txt e df_BoxB.txt e df_BoxC.txt

Exemplo:

$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

Depois de combinar todos os três arquivos, o resultado deve ser como

$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

Eu tentei usar o comando pr , que é a combinação dos arquivos que não são o resultado necessário.

Também tentei usar sdiff , mas não consegui obter resultado.

Como posso resolver isso?

    
por vadhan 25.11.2014 / 09:27

2 respostas

0

O que você quer fazer requer um pouco de programação:

#!/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";
}

Ciao, // Z \

    
por 25.11.2014 / 19:27
-1

Estou bastante certo de que você está procurando join . Infelizmente, não sou muito bom com isso. Eu sei que há uma maneira de fazê-lo preencher os campos da maneira que você quiser também, mas até agora eu só posso obter as linhas não emparelhadas para imprimir na frente da linha. join une apenas dois arquivos de cada vez, e assim as linhas não-pareadas não mostram onde você quer - pelo menos, eu acho que elas não. Sua pergunta é um pouco incerta para mim - minhas desculpas.

De qualquer forma, para usar join você deve primeiro sort a entrada no campo de junção - que é por padrão o primeiro e o que eu usei aqui:

for f in file[123]
do sort <<IN >"$f"
$(cat "$f")
IN
done

Em seguida, como eu disse, join apenas une dois arquivos por vez, então eu join os dois primeiros e canalizo essa saída para outro join para o terceiro:

join -a1 -a2 file[12] | 
join -a1 -a2 - file3  | 
column -t | sort -hk2,2

Também canalizei novamente column e sort para formatação. Os resultados seguem:

/data/java   1G   67M    9.3G  7%   NAS:/data/java   1G   67M   9.3G  7%   NAS:/data/java
/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/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
/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
/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/admin  10G  4.6G   54G   46%  NAS:/home/admin  10G  4.6G  54G   46%  NAS:/home/admin  10G  4.6G  54G   46%  NAS:/home/admin
/home/user1  40G  29.3G  107G  74%  NAS:/home/user1
/home/user   40G  29.3G  107G  74%  NAS:/home/user1
    
por 25.11.2014 / 22:35