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)
你可以通过构建一个散列/关联数组/查找表来做这种事情,例如使用 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
命令 - 但这需要在公共字段上对输入进行排序。
要添加@steeldriver的答案,请使用sort
and 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)