unix:使用第二列合并2个文件

unix:使用第二列合并2个文件,unix,merge,awk,Unix,Merge,Awk,我想根据第二列的内容合并两个文件 文件1: "4742" "209220_at" 2.60700394801826 "104" "209396_s_at" 2.60651442103297 "749" "202409_at" 2.59424724783704 "4168" "209875_s_at" 2.58773204877464 "3973" "1431_at" 2.52832098784342 "1826" "207201_s_at"

我想根据第二列的内容合并两个文件

文件1:

"4742"  "209220_at"     2.60700394801826
"104"   "209396_s_at"   2.60651442103297
"749"   "202409_at"     2.59424724783704
"4168"  "209875_s_at"   2.58773204877464
"3973"  "1431_at"       2.52832098784342
"1826"  "207201_s_at"   2.41685345240968
文件2:

"653"   "1431_at"       2.14595534191867
"1109"  "207201_s_at"   2.13777517447307
"353"   "212531_at"     2.12706340284672
"381"   "206535_at"     2.11456707231618
"1846"  "204534_at"     2.10919474441178
最终:

"3973"  "1431_at"       2.52832098784342 "653"   "1431_at"       2.14595534191867
"1826"  "207201_s_at"   2.41685345240968 "1109"  "207201_s_at"   2.13777517447307
我尝试了
comm
diff
,一些模糊的
awk
一行代码,但没有成功。 非常感谢您的帮助。
Ben

如果文件很小,用脚本语言(Perl、Python和Ruby都是不错的选择)编写一个程序,将第一个文件读入一个散列,该散列的键是第二列,然后读取第二个文件并使用散列查找来确定可以连接的内容(如果有的话)


如果文件较大,则为每个文件交换第一列和第二列,通过unix排序实用程序传递它们,然后用脚本语言合并(加上列重新排序)两个排序的文件。

您可以通过组合使用
排序
连接
命令来完成此操作。简单的方法是

join -j2 <(sort -k2 file1) <(sort -k2 file2)
如果您需要与所示完全相同的格式,那么您需要告诉
join
以这种方式输出

join -o 1.1,1.2,1.3,2.1,2.2,2.3 -j2 <(sort -k2 file1) <(sort -k2 file2)

join-o 1.1,1.2,1.3,2.1,2.2,2.3-j2如果您使用的是某些版本的bash,您还可以编写:
join-j2,但它不提供带有两组不同输入的join。请注意,这将在内存中存储整个文件1,因此您可能希望将较小的文件作为
file1
join -o 1.1,1.2,1.3,2.1,2.2,2.3 -j2 <(sort -k2 file1) <(sort -k2 file2)
awk '
  # store the first file, indexed by col2
  NR==FNR {f1[$2] = $0; next}
  # output only if file1 contains file2's col2
  ($2 in f1) {print f1[$2], $0}
' file1 file2
awk 'FNR==NR{a[$2]=$0} NR>FNR && ($2 in a){ print $0,a[$2] } ' file2 file1