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