从两个文件中查找给定列中的公共元素并输出每个文件中的列值

从两个文件中查找给定列中的公共元素并输出每个文件中的列值

我有两个带有制表符分隔值的文件,如下所示:

文件1:

A    1
B    3
C    1
D    4

文件2:

E    1
B    3
C    2
A    9

我想找到文件 1 和文件 2 之间第 1 列中的字符串相同的行,然后获取相应的值。所需的输出是一个如下所示的单个文件:

B    3    3
C    1    2
A    1    9

这可以用 Unix one-liner 来完成吗?

答案1

join如果结果中的行排序不相关,GNU coreutils 包含的命令可以完全满足您的需求:

join <(sort file1) <(sort file2)

A 1 9
B 3 3
C 1 2

如果您想要恢复选项卡,请执行以下操作:

join <(sort file1) <(sort file2) | tr ' ' '\t'

A   1   9
B   3   3
C   1   2

或者使用t选项join.

<()又名进程替换,需要 ksh93(该功能源自何处)、bash 或 zsh)

答案2

ire@localhost: sort -k1 file2 | join file1 -
A 1 9
B 3 3
C 1 2

如果您想在输出中使用制表符,请执行以下操作

sort -k1 file2 | join -t "        " file1 -

您可以通过按 CTRL-V 在引号内构建选项卡<tab>

答案3

如果您不想对输出进行排序,而是希望与 file2 具有相同的顺序,则 awk 是一个很好的工具:

awk '
    NR == FNR {val[$1]=$2; next} 
    $1 in val {print $1, val[$1], $2}
' file1 file2

相关内容