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



我有两个文件,格式为

file1(较小的文件)

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

file2(大文件)

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

我想获得一个输出文件,它只根据file1的第一列保留两个文件中的匹配行,并在找到公共列ID的地方连接这两行,例如

001 001 word1 word 3

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

多谢!

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

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

给定:

$ cat file1
001 word1
002 word2
00n wordn1
$ cat file2 
001 word3
002 word4
003 word_u1
004 word_u2
00n wordn2

(注意file2中额外的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    

最新更新