awk 询问合并两个文件
Awk asking combine two files
我通过 AWK 命令将两个不同的文件与 Same Key 组合在一起。
如果与 File1 和 File2 相比没有密钥匹配,那么就
改用“\t\t\t”。
我有以下 AWK 命令。
awk -F"\t" '
{key = }
NR == 1 {header = key}
!(key in result) {result[key] = [=10=] ; next}
{ for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
END {
print result[header],"\tValue2","\tValue3","\tValue4"
delete result[header]
PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk
for (key in result) print result[key]
}
' >
示例组合
文件 1
Key Value1
A 10000
B 20000
C 30000
D 40000
文件 2
B 50000 20000 10000
C 20000 10000 50000
然后预期结果
Key Value1 Value2 Value3 Value4
A 10000 - - -
B 20000 50000 20000 10000
C 30000 20000 10000 50000
D 40000 - - -
我的 AWK 命令展示
Key Value1 Value2 Value3 Value4
A 10000
B 20000 50000 20000 10000
C 30000 20000 10000 50000
D 40000
我已经尝试过如下几种方法
!(key in result) {result[key] = [=15=]"\t-\t-\t-" ; next}
但看起来这并没有涵盖所有情况。
有人有更好的主意吗?
谢谢!
使用 awk 可以做到:
awk -v OFS='\t' 'NR==FNR {if (!n) {n=NF-1; s="-"; for(i=2; i<=n; i++) s=s OFS "-"}
a[]=[=10=];next} in a{sub(, "&" OFS , a[]);
print a[]; next} {print [=10=], s}' file2 file1
A 10000 - - -
B 20000 50000 20000 10000
C 30000 20000 10000 50000
D 40000 - - -
此解决方案不会硬编码 File2 中有 3 个额外字段
awk '
BEGIN { FS = OVS = "\t" }
NR == FNR {
key =
= ""
store[key] = [=10=]
num_extra_fields = NF-1
next
}
FNR == 1 {
printf "%s", [=10=]
for (i=1; i <= num_extra_fields; i++)
printf "%sValue%d", OFS, i+(NF-1)
print ""
next
}
in store {
print [=10=] store[key]
next
}
{
for (i=1; i <= num_extra_fields; i++)
$(++NF)="-"
print
}
' file2 file1
由于 Whosebug 显示选项卡的方式,输出看起来有点奇怪
Key Value1 Value2 Value3 Value4
A 10000 - - -
B 20000 20000 10000 50000
C 30000 20000 10000 50000
D 40000 - - -
要修复您的代码,您需要跟踪 file2 中更新结果的键。变化
{ for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
到
{ updated[key]=1; for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
然后,在 END 块中,更改
for (key in result) print result[key]
到
for (key in result) {
if (!(key in updated)) result[key] = result[key] FS "-" FS "-" FS "-"
print result[key]
}
我通过 AWK 命令将两个不同的文件与 Same Key 组合在一起。 如果与 File1 和 File2 相比没有密钥匹配,那么就 改用“\t\t\t”。
我有以下 AWK 命令。
awk -F"\t" '
{key = }
NR == 1 {header = key}
!(key in result) {result[key] = [=10=] ; next}
{ for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
END {
print result[header],"\tValue2","\tValue3","\tValue4"
delete result[header]
PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk
for (key in result) print result[key]
}
' >
示例组合 文件 1
Key Value1
A 10000
B 20000
C 30000
D 40000
文件 2
B 50000 20000 10000
C 20000 10000 50000
然后预期结果
Key Value1 Value2 Value3 Value4
A 10000 - - -
B 20000 50000 20000 10000
C 30000 20000 10000 50000
D 40000 - - -
我的 AWK 命令展示
Key Value1 Value2 Value3 Value4
A 10000
B 20000 50000 20000 10000
C 30000 20000 10000 50000
D 40000
我已经尝试过如下几种方法
!(key in result) {result[key] = [=15=]"\t-\t-\t-" ; next}
但看起来这并没有涵盖所有情况。 有人有更好的主意吗? 谢谢!
使用 awk 可以做到:
awk -v OFS='\t' 'NR==FNR {if (!n) {n=NF-1; s="-"; for(i=2; i<=n; i++) s=s OFS "-"}
a[]=[=10=];next} in a{sub(, "&" OFS , a[]);
print a[]; next} {print [=10=], s}' file2 file1
A 10000 - - -
B 20000 50000 20000 10000
C 30000 20000 10000 50000
D 40000 - - -
此解决方案不会硬编码 File2 中有 3 个额外字段
awk '
BEGIN { FS = OVS = "\t" }
NR == FNR {
key =
= ""
store[key] = [=10=]
num_extra_fields = NF-1
next
}
FNR == 1 {
printf "%s", [=10=]
for (i=1; i <= num_extra_fields; i++)
printf "%sValue%d", OFS, i+(NF-1)
print ""
next
}
in store {
print [=10=] store[key]
next
}
{
for (i=1; i <= num_extra_fields; i++)
$(++NF)="-"
print
}
' file2 file1
由于 Whosebug 显示选项卡的方式,输出看起来有点奇怪
Key Value1 Value2 Value3 Value4
A 10000 - - -
B 20000 20000 10000 50000
C 30000 20000 10000 50000
D 40000 - - -
要修复您的代码,您需要跟踪 file2 中更新结果的键。变化
{ for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
到
{ updated[key]=1; for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
然后,在 END 块中,更改
for (key in result) print result[key]
到
for (key in result) {
if (!(key in updated)) result[key] = result[key] FS "-" FS "-" FS "-"
print result[key]
}