첫 번째 열 값을 기준으로 여러 열 병합

첫 번째 열 값을 기준으로 여러 열 병합

여러 개의 파일(10개 이상)이 있고 이를 하나의 출력 파일로 병합/결합하고 싶습니다. 예를 들면 다음과 같습니다.

파일 1

2000 0.0202094
2001 0.0225532
2002 0.02553
2003 0.0261099
2004 0.0280311
2005 0.028843

파일 2

2000 0.0343179
2001 0.036318
2003 0.039579
2004 0.0412106
2005 0.041264

파일 3

2004 0.068689
2005 0.0645474

모든 파일에는 동일한 두 개의 열이 있지만 길이는 다릅니다.

원하는 출력은 다음과 같습니다.

        file1       file2      file3
2000    0.0202094   0.0343179
2001    0.0225532   0.036318
2002    0.02553
2003    0.0261099   0.0395799
2004    0.0280311   0.0412106   0.0686893
2005    0.028843    0.041264    0.0645474

다음 코드를 시도했지만 값이 첫 번째 열과 일치하지 않습니다.

awk '{printf($1); for(i=2;i<=NF;i+=2) printf ("\t%s", $i); printf "\n"}' <(paste file*) > mergedfile.txt

답변1

awk첫 번째 열 항목을 그룹화하여 이러한 모든 파일을 한 번에 실행할 수 있습니다 . 이 부분 map[$1]?(map[$1] FS $2):($2)은 삼항 명령문입니다. 즉, 비어 있는 경우 로 인덱싱된 배열 맵에 추가하고 $1, 비어 있지 않은 경우 이미 존재하는 값에 추가한다는 의미입니다.

awk '{ map[$1] = ($1 in map)?(map[$1] FS $2):($2); } 
     END { for(i in map) print i, map[i] }' file*

생성된 출력보다 출력을 더 읽기 쉽게 만들려면 awk출력을 다음과 같이 파이프하십시오.

awk '{ map[$1] = ($1 in map)?(map[$1] FS $2):($2); } 
     END { for(i in map) print i, map[i] }' file* | column -t > mergedfile.txt

답변2

다음 스크립트로 완료

STEP1

awk '{print $1}' file1 file2 file3| awk '{if(!seen[$1]++){print $0}}' >pattern_content

STEP2

for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file1>/dev/null; if [[ $? == 0 ]]; then grep $i file1| awk '{print $2}'; else echo "                                "; fi; done > file1_o

for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file2>/dev/null; if [[ $? == 0 ]]; then grep $i file2| awk '{print $2}'; else echo "                                "; fi; done > file2_o


for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file3>/dev/null; if [[ $? == 0 ]]; then grep $i file3| awk '{print $2}'; else echo "                                "; fi; done > file3_o


step3

 paste pattern_content file1_o file2_o file3_o|sed '1i                 file1          file2               file3'| sed "s/file1/\t&/g"

산출

        file1       file2      file3
2000    0.0202094   0.0343179
2001    0.0225532   0.036318
2002    0.02553
2003    0.0261099   0.0395799
2004    0.0280311   0.0412106   0.0686893
2005    0.028843    0.041264    0.0645474

관련 정보