我有 2 个用竖线分隔的文件,例如 file1 和 file2。其中 file1 有 33 列,file2 可能有 34/35/36 列。所以我们不要考虑我们有多少列。
我想要做的是比较 file1 和 file2 中的值(从第 1 列到第 32 列)。如果所有值都相同,则从 file2 中获取值并附加到 file1 中的所有相同记录。
假设 file2 中的第一条记录在 file1 中有 5 个匹配项,则取值“|84569|21.5|1”并将其附加到 file1 上的所有匹配项(有关预期结果,请参阅 file3)。同样,对于 file2 中的第二条记录,我们在 file1 中有 5 个匹配项,因此取值“|0”并将其附加到 file1 中的所有匹配记录。 file2 中的第三条记录也是如此。有 3 个匹配项,因此取值“|21457879|12.4”并将其附加到 file1 中的所有 3 个匹配行上
如果您正在考虑如何选择从 file2 中获取值以附加到 file1 中,那么我们应该从第 34 列中获取值。虽然起始位置是固定的,但结束位置不是。就像在示例“a”中,我们从第 34/35/36 列中获取值,但对于“b”,我们只有第 34 列。但是,对于“c”,我们在第 34/35 列中获取值。
我不知道如何格式化下面示例中的数据。所以按原样给予。
文件1
a|a1|a2|a3|a4|...|a32|[email protected]
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24
c|c1|c2|c3|c4|...|c32|[email protected]
c|c1|c2|c3|c4|...|c32|$200:2011:12:06
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31
文件2
a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4
预期文件:File3
a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14|84569|21.5|1
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01|84569|21.5|1
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31|84569|21.5|1
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28|84569|21.5|1
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24|0
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24|0
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4
c|c1|c2|c3|c4|...|c32|$200:2011:12:06|21457879|12.4
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31|21457879|12.4
答案1
在此答案中,您需要指定有多少个字段组成“键”。显然在您的真实数据中它是 32,但在您的示例数据中,前 7 个字段是关键:
awk -F'|' -v nKeys=7 '
NR==FNR {
suff = ""
for (i=nKeys+2; i<=NF; i++) suff = suff FS $i
NF = nKeys
suffixes[$0]=suff
next
}
{
printf "%s", $0
NF = nKeys
print line suffixes[$0]
}
' file2 file1
我们可以计算出关键字段的数量:
awk -v nKeys=$(( $(head -1 file1 | tr '|' '\n' | wc -l) - 1 )) ...
但我们也许可以安全地对数字进行硬编码。