我想将一个文件中的一列与另一个文件中的另一列进行比较。如果列匹配,我想附加第一个文件中的第一列,作为第二个文件的第一列。
文件1
FID IID
456 2
123 1
789 3
112 4
文件2
IID column1 column2 column3... column464
1 Value11 Value12 etc etc ... etc
7 Value71 Value72 etc etc ... etc
2 Value21 Value22 etc etc ... etc
6 Value61 Value62 etc etc ... etc
3 Value31 Value32 etc etc ... etc
所需输出
FID IID column1 column2 column3... column464
123 1 Value11 Value12 etc etc ... etc
456 2 Value21 Value22 etc etc ... etc
789 3 Value31 Value32 etc etc ... etc
答案1
使用awk
:
awk 'NR==FNR { id[$2]=$1; next } ($1 in id){ print id[$1], $0}' file1 file2
在第一个操作块中,我们将 file1 读入一个名为的关联数组id
其中键是列 $2,值是列 $1;关于NR==FNR
处理第一个输入文件时始终为 true 的条件,即 awk 的内部环境变量和 NR (氮数量右ecords)对每个输入进行更新,与 FNR 相同(F伊莱氮数量右ecord),但 FNR 会为每个下一个输入文件重置。
然后在下一个操作块中,我们检查 file2 的第一列 $1 是否存在于id
array 然后打印其相应的值,id[$1]
后跟 file2 的整行 $0。
答案2
对于有限数量的字段,请尝试
join -12 -21 -o1.1,0,2.2,2.3,2.4 <(sort -nk2,2 file1) <(sort -n file2) 2>/dev/null
FID IID column1 column2 column3...
123 1 Value11 Value12 etc
456 2 Value21 Value22 etc
789 3 Value31 Value32 etc
但由于您提到的字段数量,格式可能会变得有些麻烦。