쉘 스크립트를 사용하여 두 파일의 데이터를 하나의 파일로 병합해야 합니다.

쉘 스크립트를 사용하여 두 파일의 데이터를 하나의 파일로 병합해야 합니다.

파일 1에는 다음이 포함됩니다.

hour value1           
01    25               
02    24              
03    24               
04    27  
05    30

파일 2에는 다음이 포함됩니다.

hour   value2   
01     03   
03     05   
05     03

나는 결과가 다음과 같기를 원합니다.

hour value1 value2   
01     25     03  
02     24     00  
03     24     05  
04     27     00  
05     30     03 

답변1

$ join -o1.1,1.2,2.2 -a1 -e 00 file1 file2 | column -t
hour  value1  value2
01    25      03
02    24      00
03    24      05
04    27      00
05    30      03

-o1.1,1.2,2.2보려는 관계형 조인 작업의 출력 필드를 지정합니다 . 형식은 입니다 file_number.field_number.

-a1두 번째 파일의 어떤 항목과도 ​​일치하지 않더라도 첫 번째 파일의 모든 줄을 가져오고 싶다고 말합니다 .

-e 00누락된 값은 문자열로 대체되어야 한다고 말합니다 00.

이는 두 파일이 모두 동일한 방식으로 정렬되어 있다고 가정합니다.

답변2

Awk이 작업을 수행하려면 스크립트를 사용할 수 있습니다 . 두 파일을 모두 구문 분석하고, 헤더를 건너뛰고, 내용의 해시 맵을 만들고 file2, file1다른 파일이 있는 경우 열 1의 값을 인쇄합니다(그렇지 않으면) 00표시된 대로 사용자 지정 문자열을 인쇄합니다.

#!/usr/bin/env awk

BEGIN {
    printf "hour value1 value2\n"
}

NR>1 && FNR==NR {
    hash[$1]=$2; next
}

FNR>1 {
    if ($1 in hash) {
        printf "%s\t%s\t%s\n",$1,$2,hash[$1]
    } else {
        printf "%s\t%s\t%s\n",$1,$2,"00"
    }
}

이 스크립트를 다음과 같이 실행하십시오.

awk -f script.awk file2 file1
hour value1 value2
01      25      03
02      24      00
03      24      05
04      27      00
05      30      03

이렇게 하면 원하는 결과를 얻을 수 있습니다.


읽을 수 없는 단일 명령줄 버전은 다음과 같습니다.

awk 'BEGIN{printf "hour value1 value2\n"} NR>1 && FNR==NR{hash[$1]=$2; next} FNR>1 { if ($1 in hash) {printf "%s\t%s\t%s\n",$1,$2,hash[$1] } else {printf "%s\t%s\t%s\n",$1,$2,"00"} }' file2 file1

답변3

입력 파일이 이미 hour필드 값별로 정렬되어 있는 경우 다음을 사용해 보세요.가입하다+관로:

join --header -a1 file1 file2 | awk 'NF<3{ $0=$0 OFS "00" }1' | column -t

산출:

hour  value1  value2
01    25      03
02    24      00
03    24      05
04    27      00
05    30      03

  • -a1- 파일에서 페어링할 수 없는 줄을 인쇄합니다.1

  • NF<3{ $0=$0 OFS "00" }- 일치하지 않는 빈 필드를 다음으로 대체합니다.00

관련 정보