gpt4 book ai didi

linux - 如何基于键和字符串匹配+awk比较两个文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:02 28 4
gpt4 key购买 nike

我有两个文件要根据 $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 作为键进行搜索,如果键匹配,则应用第二个条件,即如果文件 2 中的 $4 中的字符串不存在于文件 1 中的 $4 中从文件 1 中删除该行。

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 中。

最佳答案

这种匹配可以通过用相关字段填充一个或多个数组来完成,并按记录号索引。在下面的脚本中,单个条目字段四作为正则表达式与逗号分隔的字段四进行匹配,字段一只是进行等价性测试。

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

关于linux - 如何基于键和字符串匹配+awk比较两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901320/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com