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

时间:2014-01-26 23:43:38

标签: linux shell unix awk

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

file2的

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    +

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

1 个答案:

答案 0 :(得分:2)

您可以使用$2file1a[$1]=$2的值存储到数组中。所以你可以试试:

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修改file2中的$1=$1 FS a[$2],其中FS是默认字段分隔符,这是一个空格..然后重建记录,这样它就可以了由print稍后打印..
  • 如果需要,print可以简化为1。赞$2 in a { $1=$1 FS a[$2] }1
  • 请注意,这将重建file2中的记录,因此任何空格或制表符序列都将被截断为输出中的单个空格。要保留file2中的原始格式,可以使用Gnu Awk第4版中的split()函数。