![使用 shell 脚本,我需要将两个文件中的数据合并到一个文件中](https://linux22.com/image/112974/%E4%BD%BF%E7%94%A8%20shell%20%E8%84%9A%E6%9C%AC%EF%BC%8C%E6%88%91%E9%9C%80%E8%A6%81%E5%B0%86%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5%90%88%E5%B9%B6%E5%88%B0%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD.png)
文件 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
输入文件进行了排序(按字段值),请考虑使用加入+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