공통 데이터를 공유하는 두 개의 파일을 병합하고 싶습니다. File1에는 여러 개의 파일이 포함되어 있습니다2. 공유컬럼(3)을 기준으로 파일1을 기준으로 파일을 병합하고 싶은데, 파일2에 변수가 없을 경우 5번째 컬럼(AN1)에 0을 추가하고, 존재한다면, AN1의 원래 값(0 또는 1)을 추가합니다.
내 파일은 다음과 같습니다: 파일 1
CHR BP SNP CM base
20 61098 rs6078030 -0.00024510777 1
20 61795 rs4814683 0 1
20 63231 rs6076506 0.0005026053 1
20 63244 rs6139074 0.00050714752 1
파일 2
CHR BP SNP CM AN1
20 9836704 rs221007 0 1
20 9817032 rs221011 0 0
20 9764069 rs2206484 0 0
20 9639395 rs4816159 0 1
열 3(SNP)을 기준으로 일치시키고 싶습니다. 지금은 다른 모든 열을 유지하고 싶습니다.
내가 원하는 출력은 다음과 같습니다(rsX가 없거나 AN1의 원래 값이 0인 경우 0).
파일 3
CHR BP SNP CM base AN1
20 61098 rs6078030 -0.00024510777 1 1
20 61795 rs4814683 0 1 0
20 63231 rs6076506 0.0005026053 1 0
20 63244 rs6139074 0.00050714752 1 1
새로운 상황에 따라 이 코드를 수정해야 합니다.
awk 'NR==FNR{ snp[$3]; next }
{ $6=($3 in snp)?(FNR==1?"AN1":"1"):"0" }1' file2 file1
여기서는 파일 1에 rsX가 있으면 1을 인쇄합니다. AN1의 원래 값(0 또는 1)을 인쇄하고 싶습니다.
답변1
awk 'NR==FNR{ snp[$3]=$NF; next }
{ $6=($3 in snp)?(FNR==1?"AN1":snp[$3]):"0" }1' file2 file1
문제는 다음과 같습니다 awk
.
NR
: 지금까지 본 총 입력 레코드 수입니다.
FNR
: 다음 입력 파일에서는 현재 입력 파일의 입력 레코드 번호가 1로 재설정됩니다.
따라서 첫 번째 입력 파일에 대해서만 조건이 항상 true이고 조건이 true이면 NR==FNR
다음 블록이 실행되고 마지막 열 값을NR==FNR { ... }
$NF
앗열로 키가 지정된 배열 snp
입니다.$3
next
상태 이유앗나머지 코드 실행을 건너뛰고 다시 시작합니다. NF==FNR
여전히 true인 경우 첫 번째 입력 파일의 모든 레코드/줄을 읽을 때까지 블록을 반복적으로 처리합니다.
$6
그런 다음 다음 블록에서는 다음 조건을 사용하여 열 값을 추가/업데이트합니다.
snp
file1의 열 3 이 file2의 배열 에 설정된 경우 다음을 수행합니다.- 첫 번째 행인 경우 해당 값을 다음으로 설정합니다.
AN1
- 첫 번째 행이 아닌 경우 값을 다음부터 시작하도록 설정합니다.
snp[$3]
대량으로.
- 첫 번째 행인 경우 해당 값을 다음으로 설정합니다.
- 그렇지 않으면 다음으로 설정됩니다.
0
.
이것앗에돔1
결국 결과를 인쇄하는 데 사용됩니다.