두 파일을 비교하고 특정 필드에서 일치하면 출력을 인쇄하려고 합니다.
파일 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 2
file1의 연결 필드는 두 번째입니다.-2 1
file2의 연결 필드가 첫 번째입니다.-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