조인: 파일 2개 - 마지막 두 열만 추가

조인: 파일 2개 - 마지막 두 열만 추가

파일이 주어지면:

1.txt

1, abc, 123, 456, 789
2, lmn, 123, 456, 789
3, pqr, 123, 456, 789

2.txt

1, abc, 123, 000, 000
3, lmn, 123, 000, 000
9, opq, 123, 000, 000  

출력.txt

ID, NAME, X,    1A,    1B,  2A,   2B   
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000 

나는 사용했다이것참고용.

나는 다음을 사용해 보았습니다.

join -t , -a1 -a2 -1 1 -2 1 -o 0 -o 1.2 -o 1.3 -o 1.4 -o 1.5 -o 2.4 -o 2.5 -e "MISSING" 1.txt 2.txt

다음을 생성합니다.

1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789,MISSING,MISSING
3, pqr, 123, 456, 789, 000, 000
9,MISSING,MISSING,MISSING,MISSING, 000, 000

도움이 필요하세요?

답변1

혼자서 는 할 수 없을 것 같아요 join. 당신은 할 수 있습니다 :

join -t, -a1 -a2 -o0,1.2,1.3,1.4,1.5,2.2,2.3,2.4,2.5 -e MISSING 1.txt 2.txt |
  perl -F, -lape '@F[1..2]=@F[5..6] if $F[1] eq "MISSING";
                  $_=join",",@F[0..4],@F[7..8]'
  • -p: sed/awk와 같이 한 줄씩 읽기 루프를 사용합니다.
  • -a, -F,: awk와 마찬가지로 행을 필드(배열 @F)로 분할합니다.
  • -l: 행의 내용에 대해 작동합니다( awk입력이 RS( $/)에서 분할되는 경우(그러나 RS에는 포함되지 않음 $0) 및 ORS( $\)가 인쇄 전에 추가되는 경우와 같이 작동합니다).
  • -e ...: 각 줄에 대해 평가할 perl [e] 표현식입니다.
  • 그런 다음 거의 영어와 비슷하게 읽습니다. 필드 1(인덱스가 0에서 시작하는 두 번째 필드)이 "MISSING"인 경우 필드 1~2는 필드 5~6으로 설정됩니다. 그런 다음 현재 레코드의 내용($_는 awk의 $0과 같습니다)을 필드 0~4 및 7~8로 설정합니다.

실제로 동일한 내용을 작성하는 것은 awk더 이상 복잡하지 않습니다.

awk -F, -vOFS=, '$2 == "MISSING"{$2=$6;$3=$7}
                 {print $1,$2,$3,$4,$5,$8,$9}'

답변2

단지 awk를 사용하여:

awk -F, -v OFS=, '
    BEGIN {m = " MISSING"}

    # process file1
    NR == FNR {lines[$1] = $0; next} 

    # process file2
    {
        added[$1] = $4 OFS $5
        if (!($1 in lines)) {
            $4 = m
            $5 = m
            lines[$1] = $0
        }
    } 

    # print the combined output
    END {
        for (id in lines) {
            if (!(id in added)) 
                added[id] = m OFS m
            print lines[id], added[id]
        }
    }
' 1.txt 2.txt | sort -n
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000  

답변3

처음 세 개의 필드에 참여하고 싶은 것 같습니다. 그런 다음 join새 첫 번째 필드에서 처음 두 개의 구분 기호를 변경한 다음 구분 기호를 복원해야 합니다 .

join -t, -j1 -a1 -a2 -o 0 1.2 1.3 2.2 2.3 -e " MISSING" \
<(sed 's/, /\x02/;s/, /\x02/' 1.txt) <(sed 's/, /\x02/;s/, /\x02/' 2.txt) \
| sed 's/\x02/, /g'

보고

1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000

관련 정보