linux - AWK 根据另一个文件的列过滤一个文件

标签 linux unix awk

<分区>

我有两个文件。第一个文件看起来像这样(但有数千行长:

Chr10:2-20 0 0 0 0
Chr1:390-32032 1 2 0 0 
Chr3:32-3020 0 0 1029 20
Chr4:30239-40000 10 15 10 20
Chr10:2-20 9 9 1 8
Chr7:0-80 1 0 3 9
Chr8:0-30 8 6 3 3

第二个文件看起来像这样(但也有数千行)

Chr1:390-32032
Chr4:30239-40000
Chr3:32-3020
....
Chr4:30239-40000

我想生成第三个文件,它从第一个文件中提取数据,前提是该 Chr 记录在第二个文件中。所以第三个文件看起来像这样:

Chr1:390-32032 1 2 0 0 
Chr4:30239-40000 10 15 10 20
Chr3:32-3020 0 0 1029 20
Chr4:30239-40000 10 15 10 20

我对代码的想法是使用 AWK 和 fnr==nr 函数。可能将第一列放入数组中?我似乎无法让事情正常工作。任何帮助将不胜感激。

最佳答案

下面的 awk 构造应该能够做你正在寻找的事情。

awk 'NR==FNR{a[$1][$0];next} $0 in a {for (i in a[$0]) print i}' file1.txt file2.txt

地点:

a[$1] :在 file1 传递期间,创建一个二维数组 a,其中包含 file1 的第一列 ($1) 和整行 ($0)。

$0 in a :在 file2 传递期间,检查 file2 的整行($0)是否存在于数组 a 的第一个索引中

{for (i in a[$0]) print i} :如果存在,则扫描子数组并打印值。该值将为第一个文件的 $0。

关于linux - AWK 根据另一个文件的列过滤一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51645744/

相关文章:

Python:os.system 的输入被拆分

Unix 进程图困惑

linux - 需要删除文件每三行的最后一列

regex - 尝试按 awk 中的特定列值打印行

Bash:如何替换 csv 文件中的日期并将分钟四舍五入为 4 个值之一

linux - 错误的端口号-- sftp ://11. 111.10.3

linux - 我需要为此使用什么 openssl 命令?

linux - 从 AWS CLI 管道输出到特定行上的现有文件

c - 仅使用 1 个非阻塞套接字时执行 select() 是否有意义?

linux - 我可以使用 setlocale() 和 isalpha() 来确定字符是否属于当前语言环境的字母表吗?