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

时间:2011-02-11 16:53:26

标签: 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"   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

我尝试了commdiff,一些不起眼的awk单行而没有任何成功。 任何帮助非常感谢。 本

4 个答案:

答案 0 :(得分:5)

您可以结合使用sortjoin命令来完成此操作。直截了当的方法是

join -j2 <(sort -k2 file1) <(sort -k2 file2)

但显示的与您正在寻找的略有不同。它只显示公共连接字段,然后显示每个文件的剩余字段

"1431_at" "3973" 2.52832098784342 "653" 2.14595534191867
"207201_s_at" "1826" 2.41685345240968 "1109" 2.13777517447307

如果您需要的格式完全如您所示,那么您需要告诉join以这种方式输出

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

其中-o接受FILENUM.FIELDNUM说明符列表。

请注意,我使用的<()语法不是POSIX sh,因此如果需要POSIX sh语法,则应排序为临时文件。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果文件很小,用脚本语言编写程序(Perl,Python和Ruby都是不错的选择),将第一个读入哈希,其键是第二列,然后读取第二个文件并使用哈希查找以查明可以加入的内容(如果有的话)。

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

答案 3 :(得分:0)

awk 'FNR==NR{a[$2]=$0} NR>FNR && ($2 in a){ print $0,a[$2] } ' file2 file1