我有以下脚本来组合两个文件。
[0,1]
第一列是关键,$ 1和$ 2。 但是如果$ 2列有一个键但是$ 1列没有键。
然后它除了$ 1行之外还要合并。
我想只合并包含1美元的钥匙。 我怎样才能简单地合并这两个文件?
例如,
档案1
awk -F"\t" '
{key = $1}
!(key in result) {result[key] = $0; next;}
{ for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
END {
PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk
for (key in result) print result[key]
}
' $1 $2 > $3
文件2
Key Column1 Column2 Column3
Test1 500 400 200
Test2 499 400 200
Test5 600 200 150
Test6 600 199 150
Test7 599 199 100
当前合并
Key Column4 Column5
Test1 Good Good
Test2 Good Good
Test3 Good Good
Test4 Good Good
Test5 Good Good
Test6 Good Good
Test7 Good Good
预期合并。
Key Column1 Column2 Column3 Column4 Column5
Test1 500 400 200 Good Good
Test2 499 400 200 Good Good
Test5 600 200 150 Good Good
Test6 600 199 150 Good Good
Test7 599 199 100 Good Good
Test3 Good Good
Test4 Good Good
谢谢!
答案 0 :(得分:7)
你正在犯这个错误。您所描述的是一个join
操作,并且有一个非常好的UNIX工具,其名称非常明显:
$ join file1 file2 | column -t
Key Column1 Column2 Column3 Column4 Column5
Test1 500 400 200 Good Good
Test2 499 400 200 Good Good
Test5 600 200 150 Good Good
Test6 600 199 150 Good Good
Test7 599 199 100 Good Good
或者如果你坚持使用awk:
$ awk 'NR==FNR{m[$1]=$2" "$3; next} {print $0, m[$1]}' file2 file1 | column -t
Key Column1 Column2 Column3 Column4 Column5
Test1 500 400 200 Good Good
Test2 499 400 200 Good Good
Test5 600 200 150 Good Good
Test6 600 199 150 Good Good
Test7 599 199 100 Good Good
答案 1 :(得分:4)
存储到数组中时添加条件
{key = $1}
!(key in result) && NR == FNR {result[key] = $0; next;}
(key in result) { for (i=2; i <= NF; i++) {
result[key] = result[key] FS $i
}
}
END {
PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk
for (key in result) print result[key]
}
NR == FNR
确保我们存储到key
的{{1}}来自第一个文件。我们还添加result
以确保在遍历for循环之前密钥存在。
答案 2 :(得分:4)
您可以尝试以下命令:
awk '
BEGIN { FS = OFS = "\t" }
{key = $1}
FNR == NR {result[key] = $0; next;}
(key in result) { for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
END {
PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk
for (key in result) print result[key]
}
' file1 file2
我已经改变了那些检查。 FNR == NR
仅保存在第一个文件的result
行中。并且(key in result)
适用于第二个文件,并且仅为先前在第一个文件中找到的那些键附加列。
它产生:
Key Column1 Column2 Column3 Column4 Column5
Test1 500 400 200 Good Good
Test2 499 400 200 Good Good
Test5 600 200 150 Good Good
Test6 600 199 150 Good Good
Test7 599 199 100 Good Good