使用 shell 脚本,我需要将两个文件中的数据合并到一个文件中

使用 shell 脚本,我需要将两个文件中的数据合并到一个文件中

文件 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脚本来完成此操作。解析两个文件,跳过标题,创建内容的哈希映射file2file1如果存在另一个文件中的第 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输入文件进行了排序(按字段值),请考虑使用加入+awk管道:

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

相关内容