如何根据第二列中的数字将文件1中的第一列与文件2匹配?
文件文件1
k002 25
k004 54
k003 23
文件文件2
25 h
23 j
54 hg
所需输出
k002 25 h
k003 23 j
k004 54 hg
我不知道该怎么做,也没有找到类似的问题。
awk 'matching {print ... $1, $2}' file1 file2 > file_des
答案1
你也许可以这样做:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
在哪里:
FNR
:当前输入文件中的输入记录号。NR
:到目前为止看到的输入记录总数。
请注意,这会将整个读file1
入内存。
答案2
如果您不关心保留原始文件顺序,您可以使用join
:
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
或者正如 @Ed Morton 所建议的,如果您使用bash
或任何其他支持进程替代的 shell,您可以避免以这种方式创建临时文件:
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
答案3
使用awk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
在此命令中NR==FNR
,确保{ar[$2]=$0;next}
仅适用于第一个文件,因为读取第一个文件后将FNR
被设置为零。在表达式中,创建了{ar[$2]=$0;next}
一个索引数组ar
,$2
并且next
不采取进一步的操作。
该表达式($1 in ar)
查看$1
(第二个文件的第一个字段)是否存在于指数的 数组ar
.如果存在,则ar
通过此语句打印第二个文件的第二个字段{print ar[$1],$2}
。
($1 in ar)
很重要,因为这意味着第二个文件的 $1 是否匹配指数的ar
。并ar
在第一个文件的 $2 上建立索引。因此,这将检查$1
第二个文件是否$2
与第一个文件匹配。