忽略第一行但仍使用AWK在模式匹配期间打印它

时间:2014-07-08 12:06:57

标签: awk pattern-matching

我有一个直截了当的问题。如果"文件"的第一列(ID)中的元素匹配"子文件"的第一列(ID)元素,"文件"的匹配元素;应替换为"子文件"的第二列(即符号)的相应元素。

以下代码工作正常,但将第二列的第一个元素(即A)视为第一列的第一个元素。因此,在模式匹配期间,将其从最终输出中省略,并将所有元素向前移动一个单元格,将最后一个单元格留空。

我认为可能的解决方案是忽略第一行。请提出任何建议。

awk 'FNR==NR {a[$1]=$2;next} {$1=a[$1]}1' OFS="\t" subfile file

文件

             A               B                C
204639_at    1.4063964497   1.9690376378    -0.5856006063
209027_s_at -0.6184167971  -0.3803235873     0.6532643621
224864_at    0.9290801469   0.0020026866    -1.2993653537
224637_at    0.4688503882  -0.137487333     -0.453195703
226482_s_at -0.0615034202   0.4300315287    -0.6852205341

子文件

204639_at   ADA
209027_s_at ABI1
224864_at   SRA1
224637_at   OST4
226482_s_at TSTD1

获得的输出:

      B             C   
ADA   1.4063964497  1.9690376378  -0.5856006063
ABI1 -0.6184167971 -0.3803235873   0.6532643621
SRA1  0.9290801469  0.0020026866  -1.2993653537
OST4  0.4688503882 -0.137487333   -0.453195703
TSTD1 -0.0615034202 0.4300315287  -0.6852205341

需要输出

      A              B                C
ADA   1.4063964497  1.9690376378  -0.5856006063
ABI1 -0.6184167971 -0.3803235873   0.6532643621
SRA1  0.9290801469  0.0020026866  -1.2993653537
OST4  0.4688503882 -0.137487333   -0.453195703
TSTD1 -0.0615034202 0.4300315287  -0.6852205341

2 个答案:

答案 0 :(得分:1)

我根本不明白你的问题,我甚至无法在任何地方看到GSM155673。但是,如果您按照建议忽略其中一个输入文件的第一行会有所帮助,您可以尝试删除第1行:

awk '{...}' subfile <(sed 1d file)

或者,如果您不喜欢bash流程替换,可以在awk中忽略它,方法是将其添加为脚本的第一部分:

FNR==1 && NR>1 {print; next}

答案 1 :(得分:1)

这将检查是否存在匹配,如果没有,则打印当前存在的值。

awk 'FNR==NR {a[$1]=$2;next} a[$1]{$1=a[$1]}1' OFS="\t" subfile file