두 열이 첫 번째 열의 어떤 행과도 일치하지 않는 경우 두 번째 열의 해당 행을 어떻게 비교하고 0으로 만들까요?

두 열이 첫 번째 열의 어떤 행과도 일치하지 않는 경우 두 번째 열의 해당 행을 어떻게 비교하고 0으로 만들까요?

다음과 같은 파일이 있습니다.

파일 1:

    id1 id6
    id5 id2
    id2 id3
    id6 id500

두 번째 열의 내부를 첫 번째 열의 내부와 비교해 보면 두 번째 열과 첫 번째 열 모두에 id6과 id2가 존재하는 것을 알 수 있습니다. 하지만 id3과 id500은 첫 번째 열이 아닌 두 번째 열에 존재합니다. 나는 첫 번째 열에 나타나지 않기 때문에 후자를 0으로 바꾸고 싶습니다. 따라서 출력은 다음과 같아야 합니다.

산출:

id1 id6
id5 id2
id2 0
id6 0

어떤 제안이 있으십니까? "join"에서 몇 가지 명령을 시도했지만 원하는 결과를 얻지 못했습니다. 내 실제 데이터는 상당히 큽니다. 이는 작은 예입니다.

답변1

2단계 솔루션 - 첫 번째 단계에서는 필드 1의 모든 값을 배열에 저장하고 a, 두 번째 단계에서는 각 행을 인쇄하고, 두 번째 필드가 배열에 없으면 0으로 설정합니다.a

awk 'first{a[$1]; next}; {print $1, !($2 in a)? 0: $2}' first=1 file first=0 file

답변2

#/bin/perl

use strict;
use warnings;

my  %hash;
my  @array;
my( $key, $value );

while( <ARGV> )
{
    chomp;
    @array = split '\t';    
    $hash{ $array[0] } = $array[1];
}

while(( $key, $value ) = each %hash )
{
    printf "$key\t%s\n",
        exists( $hash{ $value }) ? $value : "0";
}

그러나 "거대한"이 무엇을 의미하는지 잘 모르겠습니다. 이는 데이터 크기에 관계없이 얼마나 많이 사용하는지를 의미합니다. 죄송합니다. POSIX 명령 유형 솔루션을 찾고 계시다면 이전에 이 포럼에서 답변한 적이 없습니다.

관련 정보