我有两个文件要比较,基于$ 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中。
答案 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;
}