我有两个文件file1.txt
,file2.txt
.我想根据第 2 列和第 3 列选择两者共有的记录file1.txt
,并将它们复制到附加列(来自 的第 4 列)。file2.txt
out.txt
file2.txt
输入示例:
file1.txt
abc 1 a f11 f13 f14
abd 2 b f12 f14 f13
abe 4 d f13 f16 f12
acf 5 s f14 f15 f19
file2.txt
abc 1 a f21 f23 f24
abd 1 b f21 f24 f23
abe 4 d f24 f26 f22
acf 6 s f23 f25 f29
所需输出
out.txt
abc 1 a f11 f13 f14 f21
abe 4 d f13 f16 f12 f24
我也问过类似的问题前面介绍了如何使用三个文件并根据相似的输入提取相似的输出,以便更好地理解。我是 Unix 世界的新手,一直在学习如何进行文件处理。基于此,我尝试使用下面的代码,awk
但没有成功。有人可以检查并提出建议,出了什么问题吗?
awk 'FILENAME == ARGV[1] {
m[$2,$3] = 0; z[$2,$3] = $6;
next;
}
{
if (($2,$3) in m && m[$2,$3] == 1) {
print $0 " " z[$2,$3] >"out.txt";
}
}' file2.txt file1.txt
答案1
awk
awk 'FNR==NR {
a[$2, $3]=$4
next
}
($2, $3) in a{
print $0, a[$2, $3]
}
' file2.txt file1.txt > out.txt
加入
join -j 2 \
<(sort -k2,3 file2.txt | sed 's/ /+/2') \
<(sort -k2,3 file1.txt | sed 's/ /+/2') \
-o 1.1,1.2,1.3,1.4,1.5,2.3 |
sed 's/+/ /' > out.txt
答案2
在您的示例中,您正在创建值为 0 的数组 m。您无法将其设置为 1,而且也不需要这样做。您可以将值设置为整行,例如 $0。
尝试这个:
awk 'FILENAME == ARGV[1] {
m[$2,$3] = $0;
next;
}
{
if (($2,$3) in m) {
print m[$2,$3] " " $4 >"out.txt";
}
}' file1.txt file2.txt