如何将与另一列匹配的列添加到文件中?

如何将与另一列匹配的列添加到文件中?

如何根据第二列中的数字将文件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与第一个文件匹配。

相关内容