我有两个文件。我必须从文件 1 中获取匹配的名称,打印文件 1 的全部内容,并使用具有最大值的第二个文件在文件 1 中添加第四列 (exp)
file1
name value1 value2 value3
hat_197050 30.5348 37.2617 1.2203
hat_160460 20.8679 21.0134 1.00697
hat_092950 63.875 63.2321 0.989935
file2
hat_160460 AA:0003700,AA:0003707,AA:0005634,AA:0006355,AA:0043401
hat_160460 AA:0003700,AA:0003707
期望的输出:
name value1 value2 value3 exp
hat_197050 30.5348 37.2617 1.2203
hat_160460 20.8679 21.0134 1.00697 AA:0003700,AA:0003707,AA:0005634,AA:0006355,AA:0043401
hat_092950 63.875 63.2321 0.989935
我想用awk
.我写了这两个得到匹配的列,但它只给出了匹配的
awk 'FNR==NR{a[$1]=$0;next}{if(b=a[$1]){print }}' file1 file2 > matched
this command to get the file2 with max field
awk 'BEGIN { FS = "," } ;{if (NF > max) {max = NF ; line =$0}} END{print line}' file2
我不知道如何将两者结合起来以获得我想要的东西。任何建议的阅读将不胜感激。
答案1
awk '
FNR == NR {
# Read file1
i=$1;
sub($1 FS, "");
a[i]=$0; next;
}
(FNR < NR) && (FNR == 1) {
# add new column header to title row (first line of file1)
print $0 "exp"; next;
}
{
# Read file2 and append matching line from file1
print $0 a[$1];
}
' file2 file1
请注意,在上面的解决方案中file2
读取 before来file1
提取要匹配的第一列(因此file2
在 before 中指定file1
)。此外,该解决方案将使用最后一场比赛in file2
(在您的示例中,hat_160460
在 中出现两次file2
)。
结果:
file1 name value1 value2 value3 exp
hat_197050 30.5348 37.2617 1.2203
hat_160460 20.8679 21.0134 1.00697 AA:0003700,AA:0003707
hat_092950 63.875 63.2321 0.989935
如果您想使用第一场比赛中file2
,然后将FNR == NR
上面的部分替换为
FNR == NR {
# Read file1
i=$1;
sub($1 FS, "");
if (! a[i]) a[i]=$0;
next;
}
结果:
file1 name value1 value2 value3 exp
hat_197050 30.5348 37.2617 1.2203
hat_160460 20.8679 21.0134 1.00697 AA:0003700,AA:0003707,AA:0005634,AA:0006355,AA:0043401
hat_092950 63.875 63.2321 0.989935