如何通过linux中两列的相乘来过滤两列的组合

时间:2018-08-20 07:55:58

标签: bash filtering

我有一个数据集,其中每个人都是通过两列的组合来标识的(column1 = familynumber,column2 = individualnumber),我必须从该数据集中删除个人(行),但是同样,给出了要删除的个人列表格式相同。

数据集示例:

             F2              15            0
             F2              17            0
             F3              15            0
             F4              17            0
             F4              25            0
             F6              32            0
             F6              38            0

要删除的列表(要过滤的模式)示例:

F2  15
F4  17
F6  32

输出示例

             F2              17            0
             F3              15            0
             F4              25            0
             F6              38            0

我知道grep具有使用模式组合'pattern1.*pattern2'(AND)的功能,但我还需要此功能才能在2种模式列表中起作用(一个文件包含2列,每个文件包含2个列,{ {1}}),我都没有运气尝试过。无论哪种方式,我都不知道如何正确地结合这两个功能,而且我没有想法。 我会提出任何建议,谢谢

这是我到目前为止尝试过的代码

-f

其中egrep -f rejected.i -v dataset.exm 是包含要过滤的模式的两列的文件

rejected.i

其中i.rej1和i.rej2分别是要过滤的模式的第一和第二列。

我希望它足够清楚。 再次谢谢你

1 个答案:

答案 0 :(得分:0)

$ cat i.rej1
F2
F4
F6
$ cat i.rej2
15
17
32

创建正确的病毒码文件

您可以使用paste创建特征码文件,并用正则表达式将制表符替换为一个或多个空格

$ paste i.rej1 i.rej2 | sed 's/\t/\\s+/'
F2\s+15
F4\s+17
F6\s+32

使用Process Substitution,您的grep会读取

$ grep -Evf <(paste i.rej1 i.rej2 | sed 's/\t/\\s+/') input 
             F2              17            0
             F3              15            0
             F4              25            0
             F6              38            0

paste i.rej1 i.rej2 | sed 's/\t/\\s+/' | grep -Evf- input会做同样的事情。