리눅스에서 두 파일을 연결하는 방법은 무엇입니까?

리눅스에서 두 파일을 연결하는 방법은 무엇입니까?

Linux 시스템에서 두 파일을 결합하고 싶습니다. 첫 번째 파일에 포함된 줄만 결합하고 싶습니다.

첫 번째 파일은 압축이 풀린 파일입니다(헤더 없음, 열 1개만 있음).

1_4
3_4
4_63
6_2

두 번째 파일은 gz 파일입니다(헤더, 16개 열 포함).

CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1  4  78  42   850   284   102   478   199    3777   485  2.5   2.4   23  35  336
8  3  74  24   0   2485   21   48   9    77   85  0.5   5.4   42  4312  335
many more lines

나는 다음을 시도했다.

join -11 -21 <(cat file1 | sort -k1,1) <(zcat file2.gz | sed 1,1d | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) | awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' > outfile

출력 파일에는 첫 번째 파일에 포함된 행만 포함되는 것이 아닙니다. 무엇이 잘못되고 있는지 아는 사람이 있나요?

미리 감사드립니다!

답변1

file2의 첫 번째 줄이 누락되었음을 의미하는 오류가 발생했습니다. sed 1,1d첫 번째 행이나 헤더를 삭제하거나 첫 번째 행을 다시 NR>1건너뛸 수 있습니다. awk당신은 아마 이것을 원할 것입니다 :

join -11 -21 <(cat file1 | sort -k1,1) \
             <(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) |
     awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' 

즉, 다른 모든 것은 설명대로 진행되어야 합니다. 다음 샘플 파일을 사용하여 테스트했습니다.

$ cat file1
1_4
3_4
4_63
6_2

그리고

$ zcat file2
CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1  4  78  42   850   284   102   478   199    3777   485  2.5   2.4   23  35  336
1  8  78  42   850   284   102   478   199    3777   485  2.5   2.4   23  35  336

그리고 예상대로 한 줄의 출력만 표시됩니다 1_4.

$ join -11 -21 <(cat file1 | sort -k1,1) \
               <(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | 
                    sort -k1,1) | 
    awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' 
1_4 1 4 850 42 677 102 3777 485 284
    

이것이 표시되는 내용이 아닌 경우 질문을 편집하고 오류를 재현하는 데 실제로 사용할 수 있는 예를 포함시키십시오.

관련 정보