파일 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