2016-04-27 52 views
0

我有两个文件需要根据$ 1和$ 4作为键进行比较。下面是示例文件:如何比较基于密钥和字符串匹配的两个文件+ awk

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在这两个文件中的关键,如果密钥匹配,应用第二个条件是,如果从文件2在$ 4的字符串是不是在文件1 出现在$ 4取出排来自file1。

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

从$ file1的第二行在$ 4中被删除为“AAAD016”,File2在$ 4 File1中不存在。

+0

我有一个不成功的解决方案,它在寻找$ 1密钥,但第二部分没有完成! – chas

回答

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; 
} 
+0

它不适用于制表符分隔文件吗?尝试使用-F“\ t” – chas

+0

@chas它们都应该使用制表符分隔的文件,但如果字段分隔符仅为制表符,则可能会出现混合空格/制表符文件的一些问题。 – kdhp

+0

@chas单行示例有一个错字,它已被删除。 – kdhp

相关问题