基于两列和一个条件的两个文件的交集

基于两列和一个条件的两个文件的交集

我有两个文件。一个文件以制表符分隔,内容如下

col1.     col2     col2       col4
Stef.     123       SE        383
Lena      938       Y          X
John      738       T          Y
Stef      827       uq         hd
Stef      81        tt         vv

我有另一个文件,只有一列:

837
123
839
827

我想创建一个新文件,它是第一个文件的第二列和第二个文本文件的唯一列的兴趣。但我还想考虑第一个文件的第一列。

我知道我可以使用以下方法进行交叉:

join <(sort file1) <(sort file2)

但我不知道如何在第二个文件的第一列和第一个文件的第二列上指定它,我想根据提供的与第一个文件的第一列相对应的值进行交集。例如,如果第一个文件的第一列是 Stef,我只想求两个文件之间的交集,因此生成的文件将变为:


col1.     col2     col2       col4
Stef.     123       SE        383
Stef      827       uq         hd

我如何使用 bash 和 awk 来实现这一点。我尝试在 pandas 中执行此操作,但由于我的文件非常大,因此需要很长时间才能将其加载到我的 Jupyter 笔记本上。见解将不胜感激。

我的 awk 脚本:

awk 'NR==FNR{A[$1];next}$2 in A' file2.txt file1.txt > sample.txt

答案1

我不知道我是否正确理解了这个问题,但您需要按要用作连接参数的列对文件进行排序:

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2)

123 Stef. SE 383
827 Stef uq hd

编辑:如果您想要特定的订单:

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2) | awk -F " " '{print $2 " " $1 " " $3 " " $4}'

Stef. 123 SE 383
Stef 827 uq hd

编辑:添加 grep 到过滤器,例如仅显示 Stef。而不是 Stef(没有点)

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2) | awk -F " " '{print $2 " " $1 " " $3 " " $4}' | grep "Stef\."

Stef. 123 SE 383

最后编辑(我希望)

看来您错过了简单的部分:

awk 'NR==FNR{A[$1];next}$2 in A' file2.txt file1.txt | grep "^Stef"

答案2

取决于您是否要完全$1匹配Stef

$ awk 'NR==FNR{a[$1]; next} (FNR==1) || (($2 in a) && ($1=="Stef"))' file2 file1
col1.   col2    col2    col4
Stef    827     uq      hd

或以 开头的单词Stef,例如Stef.

$ awk 'NR==FNR{a[$1]; next} (FNR==1) || (($2 in a) && ($1~/^Stef/))' file2 file1
col1.   col2    col2    col4
Stef.   123     SE      383
Stef    827     uq      hd

相关内容