根据第一列 ID 连接两个文件

时间:2021-01-21 14:30:49

标签: ubuntu join awk grep

我有两个文件,带有模式

file1(较小的文件)

001 word1
002 word2
... ....
00n wordn

file2(更大的文件)

001 word3
002 word4
... ....
00n wordn

我想得到一个输出文件,它只保留两个文件中匹配的行,基于 file1 的第一列,并连接两行找到一个公共列 ID,例如

001 001 word1 word 3

尝试了 join、grep 和 awk 的各种组合,但任务似乎超出了我的能力。

非常感谢!

2 个答案:

答案 0 :(得分:1)

awk 'NR==FNR { map[$1]=$2;next } map[$1] { print $1" "$1" "map[$1]" "$2 } ' file1 file2

处理第一个文件 (NR==FNR) 并创建一个数组(映射),其中第一个空格分隔字段作为索引,第二个字段作为值。然后对于第二个文件,检查map中是否有条目,如果有,将第一个字段与索引和第二个字段的map中的值一起打印两次。

答案 1 :(得分:0)

给定:

$ cat file1
001 word1
002 word2
00n wordn1

$ cat file2 
001 word3
002 word4
003 word_u1
004 word_u2
00n wordn2

(注意文件 2 中额外的 003 word_u1004 word_u2...)

您可以使用 join 将这些文件(如所示)连接在一起:

$ join file1 file2
001 word1 word3
002 word2 word4
00n wordn1 wordn2

如果文件未排序(如您所显示的那样),您可以先排序:

$ join <(sort file1) <(sort file2)

如果你想把数字加倍,用管道传送到 sed:

$ join file1 file2 | sed -nE 's/^([^[:space:]]*)/\1 \1/p'
001 001 word1 word3
002 002 word2 word4
00n 00n wordn1 wordn2

或者指定join输出列表:

$ join -o 1.1,2.1,1.2,2.2 file1 file2
001 001 word1 word3
002 002 word2 word4
00n 00n wordn1 wordn2    
相关问题