공통 열을 기반으로 두 파일을 병합합니다.

공통 열을 기반으로 두 파일을 병합합니다.

2개의 파일이 있습니다. 파일 1은 다음과 같습니다.

chr19   4124051 4124250 1
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4
chr12   128823901   128824100   5

파일 2는 다음과 같습니다.

chr19   4124051 4124250 1   CUP
chr15   74995401    74995550    4   CUP
chr12   128823901   128824100   5   CUP
chr12   122752651   122752950   8   CUP
chr13   113297001   113297350   9   CUP

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

chr19   4124051 4124250 1 CUP
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4 CUP
chr12   128823901   128824100   5 CUP

File1의 열 4를 기반으로 두 파일을 병합하고 일치하는 경우 File2의 열 5 값을 File1의 마지막 열에 추가하고 싶습니다.

나는 이것에 지쳤습니다.

awk 'FNR==NR{a[$4]=$5;next} {print $1,$2,$3,$4,a[$4]}' File2 File1 > file3

하지만 작동하지 않습니다. 각 행 아래에 추가 행을 만듭니다.

나는 또한 Join 명령을 시도했습니다.

join -1 4 -2 4 -o'1.1,1.2,1.3,1.4,2.5' File1 File2

빈 파일이 생성됩니다.

어떤 제안이 있으십니까?

답변1

파일은 Windows에서 생성되었으므로 Windows 스타일 줄 끝( \r\n)이 있습니다. 제거 \r하면 모든 것이 예상대로 작동합니다.

sed -i 's/\r//' File1
sed -i 's/\r//' File2
awk 'FNR==NR{a[$4]=$5;next} {print $1,$2,$3,$4,a[$4]}' File2 File1 > file3

답변2

가입하다+유형해결책:

join -j4 -a1 -o1.1,1.2,1.3,1.4,2.5 <(sort -k4 File1) <(sort -k4 File2) | column -t

산출:

chr19  4124051    4124250    1  CUP
chrX   154458151  154458200  2
chr22  37019451   37019600   3
chr15  74995401   74995550   4  CUP
chr12  128823901  128824100  5  CUP

  • -j4- 4열부터 조인

  • -a1- 첫 번째 파일에서 페어링할 수 없는 줄을 인쇄합니다.

  • sort -k4 File1- 네 번째 열/키를 기준으로 파일 정렬( -k4)

답변3

perl -F'\s+' -lane '
   s/\r$//; my $i = join $;, @F[0,3];
   @ARGV and $h{$i} = $F[4],next;
   print exists $h{$i} ? s/$/ $h{$i}/r : $_;
' File2 File1

다음을 제공합니다:

chr19   4124051 4124250 1
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4 CUP
chr12   128823901   128824100   5 CUP

관련 정보