文件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
$1
file2