我有两个文件,带有模式
file1(较小的文件)
001 word1
002 word2
... ....
00n wordn
file2(更大的文件)
001 word3
002 word4
... ....
00n wordn
我想得到一个输出文件,它只保留两个文件中匹配的行,基于 file1 的第一列,并连接两行找到一个公共列 ID,例如
001 001 word1 word 3
尝试了 join、grep 和 awk 的各种组合,但任务似乎超出了我的能力。
非常感谢!
答案 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_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