我有两个文件,格式为
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_u1
和004 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