比较第一个文件的第一列和第二个文件的第二列并匹配

比较第一个文件的第一列和第二个文件的第二列并匹配

文件1:Excel 文件 (.xls)

UN          ID    St      M1    M2       SE    DOF  PV        PA            FC
17127159    0   -5.9    297.3   765.7   0.22    4   0.003   0.00389231  2.57536
17127163    2   -3.87   189.914 492.307 0.3548  4   0.0179  0.01795     2.59226
17127167    4   -3.8908 339.136 855.276 0.3429  4   0.0176  0.017       2.52192
17127171    6   -3.922  390.44  986.365 0.340   4   0.0172179   0.01721 2.52627
17127175    8   -4.715  536.072 1210.65 0.2492  4   0.00920158  0.00920 2.258

文件2:文本文件(.txt)

UNIT_ID   UN      TID        X       E       GG7     J     O
0      17127159 16657436 353.568 335.295 221.717 815.654 684.85
1      17127161 16657436 11.0842 7.01459 7.33511 11.2121 12.6268
2      17127163 16657450 221.647 226.774 136.274 431.32  392.533
3      17127165 16657452 5.02182 3.41172 4.12834 6.90306 4.91183

如果第一个文件的第一列与第二个文件的第二列匹配,则从第 3 列到第 9 列提取第二个文件的匹配行并将它们保存在第一个文件中。

谁能帮我 ?

输出应保存在新文件中

输出:

UN        ID   St  M1    M2    SE   DOF PV    PA    FC    TID     X  E  GG7  J O
17127159  0   -5.9  297.3   765.7   0.22    4   0.003   0.00389231  2.57536  16657436 353.568 335.295 221.717 815.654 684.85

答案1

解决方案awk

$ awk 'NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next} 
              {
                if($1 in a){
                    print $0,a[$1]
                }
               }' file2 file1
UN          ID    St      M1    M2       SE    DOF  PV        PA            FC TID  X   E   GG7 J   O   
17127159    0   -5.9    297.3   765.7   0.22    4   0.003   0.00389231  2.57536 16657436    353.568 335.295 221.717 815.654 684.85  
17127163    2   -3.87   189.914 492.307 0.3548  4   0.0179  0.01795     2.59226 16657450    221.647 226.774 136.274 431.32  392.533 

解释

awk 将每个输入行拆分为字段(默认情况下为空白),使第一个字段成为$1第二个字段,$2依此类推。特殊变量NR是当前输入行号,也是FNR正在读取的文件的当前行号。因此,当处理多个文件时,只有在读取第一个文件时两者才相等。

  • NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}:如果我们正在读取第一个文件,请将字段 3 到 9(通过制表符连接)保存为数组中的值,a该数组的键是第二个字段。然后,跳到该next行。
  • next可确保脚本的其余部分不会针对第一个文件 ( file2) 运行,而仅针对第二个文件 ( file1) 运行。

  • if($1 in a){ print $0,a[$1] }:我们现在位于第二个文件 ( file1)。如果第一个字段作为a数组 ( )中的键存在if($1 in a),则打印当前行以及for : fields 3 through 9 from 中$0存储的值。 a$1file2

相关内容