동일하고 다른 데이터 포인트가 있는 동일한 형식의 여러 테이블을 어떻게 병합 및 추가하고, 빈 데이터 포인트에 0을 입력하여 모든 테이블을 병합할 수 있습니까? 필수 입력 파일은 다음과 같습니다.
파일 1
17 64298926 0.000599042
17 64298927 0.000399361
17 64298992 0.000199681
17 64299103 0.000399361
17 64299131 0.000199681
파일 2
17 64298959 0.76087
17 64299360 0.75
17 64299462 1
17 64299584 0.5
파일 3
17 64298930 0.0016835
17 64298939 0.00117647
17 64298959 0.0888383
17 64298980 0.00111359
17 64299003 0.0011236
17 64299014 0.00239234
17 64299026 0.00132626
17 64299030 0.00125628
17 64299039 0.00112867
17 64299041 0.00112108
17 64299058 0.00110619
17 64299101 0.00114155
17 64299123 0.00114943
17 64299152 0.00115741
.
.
.
.
. 파일 N
까지
원하는 출력은 다음과 같아야합니다
17 64298926 0.000599042 0 0
17 64298927 0.000399361 0 0
17 64298992 0.000199681 0 0
17 64299103 0.000399361 0 0
17 64299131 0.000199681 0 0
17 64298959 0 0.76087 0.0888383
17 64299360 0 0.75 0
17 64299462 0 1 0
17 64299584 0 0.5 0
17 64298930 0 0 0.0016835
17 64298939 0 0 0.00117647
17 64298980 0 0 0.00111359
17 64299003 0 0 0.0011236
17 64299014 0 0 0.00239234
17 64299026 0 0 0.00132626
17 64299030 0 0 0.00125628
17 64299039 0 0 0.00112867
17 64299041 0 0 0.00112108
17 64299058 0 0 0.00110619
17 64299101 0 0 0.00114155
17 64299123 0 0 0.00114943
17 64299152 0 0 0.00115741
추가되는 추가 열 수는 파일 수의 n-1이어야 합니다.
이 작업을 수행하는 지름길(한 줄짜리)이 있습니까?
답변1
긴 awk
한 줄:
awk '{keys[$2]=$1; filenames[FILENAME]++; values[FILENAME,$2]=$3}END{for (k in keys){printf("%s %s ", keys[k], k); for (f in filenames){printf("%s ", values[f,k]?values[f,k]:0)} printf("\n");}} ' File? | sort
위 파일을 기반으로 한 결과는 다음과 같습니다.
17 64298926 0.000599042 0 0
17 64298927 0.000399361 0 0
17 64298930 0 0 0.0016835
17 64298939 0 0 0.00117647
17 64298959 0 0.76087 0.0888383
17 64298980 0 0 0.00111359
17 64298992 0.000199681 0 0
17 64299003 0 0 0.0011236
17 64299014 0 0 0.00239234
17 64299026 0 0 0.00132626
17 64299030 0 0 0.00125628
17 64299039 0 0 0.00112867
17 64299041 0 0 0.00112108
17 64299058 0 0 0.00110619
17 64299101 0 0 0.00114155
17 64299103 0.000399361 0 0
17 64299123 0 0 0.00114943
17 64299131 0.000199681 0 0
17 64299152 0 0 0.00115741
17 64299360 0 0.75 0
17 64299462 0 1 0
17 64299584 0 0.5 0
출력 구분 기호로 공백을 임의로 사용합니다.
확장된 스크립트는 다음과 같습니다.
{
keys[$2]=$1;
filenames[FILENAME]++;
values[FILENAME,$2]=$3
}
END {
for (k in keys) {
printf("%s %s ", keys[k], k);
for (f in filenames) {
printf("%s ", values[f,k]?values[f,k]:0)
}
printf("\n");
}
}