【问题标题】:Compare two files of different columns and print different columns比较不同列的两个文件,打印不同的列
【发布时间】:2014-01-26 23:43:38
【问题描述】:

我想比较 file2 的第二列和 file1 的第一列。如果它们相等,我想将 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

输出.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 的第二列添加到输出中。

【问题讨论】:

  • 为什么要求的输出中没有chr5 b ENST00000504031 utr5 0 +
  • 感谢@Håkon Hægland,我在文件中删除了 2 行

标签: linux shell unix awk


【解决方案1】:

您可以使用a[$1]=$2file1 中的$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=$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() 函数..

【讨论】:

  • 嗨@Håkon Hægland,我在执行awk 'NR==FNR{a[$1]=$2;next}$2 in a {$1=$1 FS a[$2] print }' file1 file2 时遇到错误,它不起作用
  • 感谢@Håkon Hægland,如果我想将 output.txt 中文件 1 的第二列打印为第三列,需要做什么。只是好奇
  • 不客气。我认为您可以在$1=$1 FS a[$2] 中将$1 替换为$2 以将其移至第三列而不是第二列..(即:$2=$2 FS a[$2]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2015-01-20
  • 2020-12-29
  • 2020-05-18
  • 2023-02-01
相关资源
最近更新 更多