gpt4 book ai didi

bash - 根据单独文件中列出的值从文本文件中删除观察结果

转载 作者:行者123 更新时间:2023-11-29 09:46:44 26 4
gpt4 key购买 nike

我有一个约 15,000,000 行的文本文件(文件 A),其中包含以下列:

1   1:693731    0   693731  G   A
1 1:706992 0 706992 T C
1 1:707014 0 707014 C A
1 1:715142 0 715142 T G
1 1:724721 0 724721 A C
1 1:729679 0 729679 C G
...

在一个单独的文件(文件 B)中,我有一个包含约 80,000 个观察值的列表,我想从文件 A 中删除:

1:706992
1:715142
1:729679
...

我想根据第 2 列(在文件 B 中列出)中的值从文件 A 中删除行并打印输出。因此,输出文件应如下所示:

1   1:693731    0   693731  G   A
1 1:707014 0 707014 C A
1 1:724721 0 724721 A C

任何输入将不胜感激。

最佳答案

单程awk解决方案:

awk 'NR==FNR { xclude[$0]++; next } !xclude[$2]' fileB fileA
  • NR==FNR { xclude[$0]++; next }仅处理来自第一个输入文件 ( fileB ) 的行并将其行 ( $0 ) 存储为关联数组 xclude 的键具有关联的非零值(凭借 ++ )。

    • NR (整体行索引)仅等于 FNR 第一个 输入文件的(特定于输入文件的行索引); next跳过脚本的其余部分并继续到下一个输入行。
  • !xclude[$2]因此仅对来自第二个输入文件(fileA)的行进行评估,并且仅打印其第二列值($2)不(!)包含在排除数组中的行,xclude .

    • 注意模式 !xclude[$2]评估为 true 隐式打印手头的行,因为这是 Awk 在没有关联操作 ({...}) 时的默认操作。

在评论中,karakfa建议使用以下变体,它绕过了对 ++ 的需要:

awk 'NR==FNR { xclude[$0]; next } !($2 in xclude)' fileB fileA
  • 简单地引用一个数组元素会导致 Awk 隐式创建它,因此 xclude[$0] ,尽管没有分配,但创建了一个元素,其键值为$0。 .

  • $2 in xclude然后简单地测试 key $2存在在数组中 xclude与运营商 in (没有测试,在这种情况下它是空的)。

关于bash - 根据单独文件中列出的值从文本文件中删除观察结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953193/

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