我有两个文件。一个文件以制表符分隔,内容如下
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