awk를 사용하여 두 파일 비교

awk를 사용하여 두 파일 비교

두 파일을 비교하고 특정 필드에서 일치하면 출력을 인쇄하려고 합니다.

파일 1.txt:

bart:29482164591748
 apu:29482164591748
smithers:68468468468464
lisa:68468468468464
maggie:2348578903247548

파일 2.txt:

68468468468464:keyboard
68463894578424:user
29482164591748:computer

나는 다음과 같은 출력을 원합니다.

bart:29482164591748:computer

답변1

고전 작품 join:

join -t: -1 2 -2 1 -o 2.1,1.1,1.2 <(sort -t: -k1,1 file1) <(sort -t: -k2,2 file2)
  • -t:구분 기호로 콜론을 지정합니다.
  • -1 2file1의 연결 필드는 두 번째입니다.
  • -2 1file2의 연결 필드가 첫 번째입니다.
  • -o 2.1,1.1,1.2출력 형식.
  • <(...)-k1,1: 두 파일은 결합 필드 (and)에서 정렬되어야 하며 -k2,2구분 -t:기호로 콜론을 지정해야 합니다 sort.

답변2

그리고 awk:

awk -F: 'NR==FNR{a[$1]=$2;next}a[$2]{print $1":"$2":"a[$2]}' file1 file2

산출:

bart:29482164591748:computer
smithers:68468468468464:keyboard
lisa:68468468468464:keyboard

설명하다:

  • awk -F:필드 구분 기호로 콜론을 처리하는 awk 시작
  • NR==FNR{}첫 번째 파일만 처리
  • a[$1]=$2;next두 번째 필드의 값을 사용하여 첫 번째 필드로 인덱싱된 배열을 구축한 a후 다음 줄로 이동합니다.
  • a[$2]{}두 번째 필드의 현재 인덱스를 사용하여 이전에 생성된 배열의 값이 비어 있지 않은 경우에만 처리합니다( next이전 표현식의 단어로 인해 file2에 대해서만 이 작업을 수행함).
  • print $1":"$2":"a[$2]필요에 따라 모든 것을 인쇄하십시오.

질문이 수정되었습니다:

awk -F: 'NR==FNR{a[$1]=$2;next}a[$2]{print $1":"$2":"a[$2]}' file2 file1

산출:

bart:29482164591748:computer
 apu:29482164591748:computer
smithers:68468468468464:keyboard
lisa:68468468468464:keyboard

답변3

사용하지 않을 awk것이지만 사용할 것입니다 perl.

#!/usr/bin/env perl
use strict;
use warnings;

#open both files for reading
open( my $input1, '<', "file1.txt" ) or die $!;
open( my $input2, '<', "file2.txt" ) or die $!;

#read the key-values into a hash called lookup. 
my %lookup = do { local $/; <$input1> =~ m/(\d+):(\w+)/g; };

#iterate by line of second file
while ( <$input2> ) { 
    #trim trailing linefeeds
    chomp;
    #split current line on :
    my ( $user, $key ) = split /:/;
    #if exists in original lookup, display record 
    if ( $lookup{$key} ) {
        print join ( ":", $user, $key, $lookup{$key}),"\n";
    }
}

그러나 내가 얻는 결과는 약간 다릅니다. 구체적으로 다음과 같습니다.

bart:29482164591748:computer
smithers:68468468468464:keyboard
lisa:68468468468464:keyboard

왜 2번째인지 모르겠음해서는 안 된다일치하는 키 값을 기반으로 인쇄합니다.

본질적으로 동일한 단일 안감을 원하는 경우:

perl -F: -lane "print $k{$F[0]}.':'.$_ if $k{$F[0]}; $k{$F[1]}//=$F[0];" file2.txt file1.txt

관련 정보