比较不同列的两个文件并打印不同的列

我想比较文件2的第二列与文件1的第一列。 如果它们相等,我想将file1的第二列添加到file2 ,如output.txt所示。

文件2

chr5 ENST00000514151 utr5 0 + chr5 ENST00000512281 utr5 0 + chr5 ENST00000512281 utr5 0 + chr5 ENST00000512281 utr5 0 + 

文件1

 ENST00000512281 a ENST00000504031 b ENST00000776348 c 

output.txt的

 chr5 a ENST00000512281 utr5 0 + chr5 a ENST00000512281 utr5 0 + chr5 a ENST00000512281 utr5 0 + 

我能够比较文件

 awk 'NR==FNR{a[$1];next}$2 in a{print}' file1 file2 

这给出了下面的输出:

 chr5 ENST00000512281 utr5 0 + chr5 ENST00000512281 utr5 0 + chr5 ENST00000512281 utr5 0 + 

但是我不知道如何将file1的第二列添加到输出中。

Solutions Collecting From Web of "比较不同列的两个文件并打印不同的列"

您可以使用a[$1]=$2$2的值存储在file1 。 所以你可以尝试:

 awk ' NR==FNR{ a[$1]=$2 ; next } $2 in a { $1=$1 FS a[$2] print }' file1 file2 

输出:

 chr5 b ENST00000504031 utr5 0 + chr5 b ENST00000504031 utr5 0 + chr5 a ENST00000512281 utr5 0 + chr5 a ENST00000512281 utr5 0 + chr5 a ENST00000512281 utr5 0 + 

说明:

  • 这使用$1=$1 FS a[$2]file2修改$1 ,其中FS是缺省字段分隔符,这是一个空格,然后重新生成记录,以便稍后print
  • print可以被简化为1如果需要的话。像$2 in a { $1=$1 FS a[$2] }1
  • 请注意,这会重建file2的记录,因此任何空格或制表符的序列将被截断为输出中的单个空间。 为了保持原始格式在file2可以使用Gnu Awk版本4中的split()函数..