首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bash代码组合两个共享模式的文本

使用bash代码组合两个共享模式的文本
EN

Stack Overflow用户
提问于 2012-03-29 00:12:56
回答 1查看 81关注 0票数 2

我有以下两个文本文件:

第一个:

代码语言:javascript
复制
chr10   1000    1001    DEL 2.4807  chr10   7443    8978
chr10   1005    1008    DEL 1.2799  chr10   7321    8778

第二个:

代码语言:javascript
复制
chr13  3456  6746  chr10 7443   8978
chr13  6453  8767  chr10 7321   8778

我们可以看到它们有一个共同的模式:

代码语言:javascript
复制
chr10   7443    8978
chr10   7321    8778

因此,基于此模式,我如何将它们组合成:

代码语言:javascript
复制
chr10   1000    1001    DEL 2.4807  chr10   7443    8978 chr13  3456  6746
chr10   1005    1008    DEL 1.2799  chr10   7321    8778 chr13  6453  8767

谢谢

编辑:我一直在尝试grep,比如:

代码语言:javascript
复制
cat text1|grep -f `cat text2|awk '{print $4"\t"$5"\t"$6}'`

但它不起作用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-29 00:42:30

您可以在awk一行程序中处理这三个字段。这是一个证据:

代码语言:javascript
复制
[ghoti@pc ~]$ cat file1
chr10   1000    1001    DEL 2.4807  chr10   7443    8978
chr10   1005    1008    DEL 1.2799  chr10   7321    8778
[ghoti@pc ~]$ cat file2
chr13  3456  6746  chr10 7443   8978
chr13  6453  8767  chr10 7321   8778
[ghoti@pc ~]$ awk 'NR == FNR { what[$(NF-2),$(NF-1),$(NF)] = $0; next; } { printf("%s %s\n", what[$(NF-2),$(NF-1),$(NF)], $0); }' file1 file2
chr10   1000    1001    DEL 2.4807  chr10   7443    8978 chr13  3456  6746  chr10 7443   8978
chr10   1005    1008    DEL 1.2799  chr10   7321    8778 chr13  6453  8767  chr10 7321   8778
[ghoti@pc ~]$ 

如果您希望文件的顺序不同,只需在printf()中更改$0what[]的顺序即可。

请注意,这里假设您可以将第一个文件的全部内容加载到内存中的数组中。可能不应该用于数百万行的文件,但这将完全取决于您运行它的系统。

这是如何工作的?

awk脚本有两个主要部分,每个部分都用大括号括起来。第一部分仅在NR (到目前为止读取的所有数据的当前记录号)与FNR (当前文件中的记录号)匹配时运行。换句话说,它只作用于第一个文件。第一个文件以关联数组的形式加载到内存中,该数组的下标是该行的最后三个字段。

第二部分作用于第一个文件之后的每个后续文件。它只是打印当前行,但是在前面加上与当前行的最后三个字段相匹配的数组内容(在第一部分中匹配)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9911598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档