如何根据键和字符串匹配+ awk比较两个文件

时间:2016-04-27 21:33:09

标签: linux awk

我有两个文件要比较,基于$ 1和$ 4作为键。以下是示例文件:

File1.txt
ID_41088912_41091911    2999    4   BAD016,BAD036,BBD052    7
ID_73937477_73940042    2565    3   BAD016,BAD036,BAD052    7
ID_32904202_32912400    8198    4   BAD016,BAD036,BAD052    7

File2.txt 
ID_41088912_41091911    2998    4   BAD016  7
ID_73937477_73940042    2565    3   AAAD016 7
ID_32904202_32912400    8198    4   BAD036  7

在两个文件中使用$ 1作为密钥进行搜索,如果密钥匹配,则应用第二个条件,即如果File1中的$ 4中的字符串不存在于File1中的$ 4中 从file1中删除该行。

Output:
ID_41088912_41091911    2999    4   BAD016,BAD036,BBD052    7
ID_32904202_32912400    8198    4   BAD016,BAD036,BAD052    7

file1的第二行被删除为" AAAD016"在$ 4中,File2不存在于File4中。

1 个答案:

答案 0 :(得分:0)

可以通过使用相关字段填充数组或数组来完成此匹配,并按记录编号索引。在下面的脚本中,单个输入字段4作为正则表达式与逗号分隔字段4匹配,而字段1仅针对等效性进行测试。

NR == FNR {
    # Check that $4 can be used as a pattern, this check
    # can be ommitted if the input is always valid.
    if ($4 !~ /^[[:alnum:]]+$/)
        exit 65; # EX_DATAERR
    a[NR] = $1;
    b[NR] = $4",|,"$4"|^"$4"$";
    next;
} $1 == a[FNR] && $4 ~ b[FNR]

应首先使用file2

调用上述脚本
awk -f script file2 file1

对于大型文件,使用getline逐行读取文件时可以应用相同的过程。

BEGIN {
    if (ARGC != 3)
        exit 64; # EX_USAGE
    while (getline <ARGV[1]) {
        a = $1;
        b = $4",|,"$4"|^"$4"$";
        # Check that $4 can be used as a pattern, this check
        # can be ommitted if the input is always valid.
        if (b !~ /^[[:alnum:]]+$/)
            exit 65; # EX_DATAERR
        getline <ARGV[2];
        if ($1 == a && $4 ~ b)
            print;
    }
    exit;
}