如何提取具有共同列的记录?

Neg*_*gar 6 command-line text-processing

我有两个具有不同列数和行数的表。我想使用公共列(B 列是公共的)查找行。这是一个例子。能否请你帮忙?

file1.txt

A  B    C   D
a  b    c   d
i  ii  iii iV
*  **   #  ##
Run Code Online (Sandbox Code Playgroud)

file2.txt

E  B  
f  ff 
h  b
g  gg
k  ii
Run Code Online (Sandbox Code Playgroud)

输出:

A  B    C   D  E
a  b    c   d  h
i  ii  iii iV  k
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 7

你可以通过构建一个散列/关联数组/查找表来做这种事情,例如使用 Awk:

$ awk 'NR==FNR{B[$2]=$1; next} $2 in B {print $0,B[$2]}' file2.txt file1.txt
A  B    C   D E
a  b    c   d h
i  ii  iii iV k
Run Code Online (Sandbox Code Playgroud)

还有join命令 - 但这需要在公共字段上对输入进行排序。


Chr*_*röm 5

要添加@steeldriver的答案,请使用sortand join

join -j 2 -o 1.1,0,1.3,1.4,2.1 <(sort -k 2 file1.txt)  <(sort -k 2 file2.txt)
Run Code Online (Sandbox Code Playgroud)
  • -j 2告诉join哪个字段是关键。
  • -o给出输出中字段的顺序,其中0是公共键,其他是FILENUM.FIELD。详情请参阅man join
  • -k 2告诉sort哪个字段是关键。
  • <( )bash过程替换。

输出是:

a b c d h
A B C D E
i ii iii iV k
Run Code Online (Sandbox Code Playgroud)