文件比较错误 - awk

文件比较错误 - awk

我有两个文件file1.txtfile2.txt.我想根据第 2 列和第 3 列选择两者共有的记录file1.txt,并将它们复制到附加列(来自 的第 4 列)。file2.txtout.txtfile2.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

相关内容