다른 텍스트 파일의 데이터를 셸의 파일과 비교하고 인쇄합니다.

다른 텍스트 파일의 데이터를 셸의 파일과 비교하고 인쇄합니다.

Shell에서 다양한 텍스트 파일의 데이터를 비교하고 인쇄하는 방법.

나는 다음을 사용하여 NAS세 가지 다른 상자의 세부 사항을 캡처 했습니다.SSH마운트 이름동일한 경우 첫 번째 열에 있어야 합니다.세 개의 상자에 존재하는 경우 동일한 줄에 인쇄되어야 합니다.에만 나타납니다BOX_B그리고BOX_C그 다음에마운트 이름첫 번째 열에 나타나야 하며박스_A비워두어야 합니다

두 가지 예를 들어보자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

세 파일을 모두 병합한 후 결과는 다음과 같습니다.

$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\

답변2

그래요매우 확신하다당신이 찾고있는 join. 안타깝게도 저는 이 일을 잘 못합니다. 원하는 방식으로 필드를 채우는 방법이 있다는 것을 알고 있지만 지금까지는 줄 시작 부분에만 짝이 없는 줄만 인쇄할 수 있습니다. join한 번에 두 개의 파일만 연결되므로 짝이 없는 줄은 원하는 곳에 표시되지 않습니다. 적어도 나에게는 그렇습니다.생각하다그들은하지 않습니다. 귀하의 질문이 약간 불분명합니다. 죄송합니다.

어쨌든 , 사용하려면 join먼저sort필드 조인- 기본적으로 이것이 첫 번째 것이며 여기서는 다음을 사용합니다.

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

다음으로 앞서 말했듯이 join한 번에 두 개의 파일만 연결할 수 있으므로 join처음 두 파일을 편집하고 해당 출력을 다른 파일로 파이프하여 join세 번째 파일을 얻었습니다.

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

나는 또한 그것을 column다시 sort포맷하기 위해 파이프를 연결했습니다. 결과는 다음과 같습니다.

/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

관련 정보