比较两列:如果匹配,则在新列中打印值,如果不匹配,则将第二列的值打印到新列

Posted

技术标签:

【中文标题】比较两列:如果匹配,则在新列中打印值,如果不匹配,则将第二列的值打印到新列【英文标题】:Comparing two columns: if they match, print the value in a new column and if they do not match print the value of the second column to the new column 【发布时间】:2021-10-30 05:07:36 【问题描述】:

我有一个包含多列的文件。我想比较 A1 ($4) 和 A2 ($14),如果值不匹配,则打印 A2 ($14) 的值。如果值匹配,我想打印 A1 的值(15 美元)。

文件:

chr SNP BP A1 TEST N OR Z P chr SNP cm BP A2 A1
20 rs6078030 61098 T ADD 421838 0.9945 -0.209 0.8344 20 rs6078030 0 61098 C T
20 rs143291093 61270 G ADD 422879 1.046 0.5966 0.5508 20 rs143291093 0 61270 G A
20 rs4814683 61795 T ADD 417687 1.015 0.6357 0.525 20 rs4814683 0 61795 G T

期望的输出:

chr SNP BP A1 TEST N OR Z P chr SNP cm BP A2 A1 noneff
20 rs6078030 61098 T ADD 421838 0.9945 -0.209 0.8344 20 rs6078030 0 61098 C T C
20 rs143291093 61270 G ADD 422879 1.046 0.5966 0.5508 20 rs143291093 0 61270 G A A
20 rs4814683 61795 T ADD 417687 1.015 0.6357 0.525 20 rs4814683 0 61795 G T G

我首先检查了第 4 列和第 15 列之间的差异。

awk '$4!=$15print $4,$15' file > diff

然后我尝试编写 if-else 语句:

awk 'if($4=$14) print $16=$14 ; else print $16=$15' file > new_file

【问题讨论】:

你介意澄清一下逻辑吗?当我阅读您的描述时,无论如何,第 16 列都会收到第 15 列的值。 我编辑了我的问题,很抱歉造成混乱。我想比较 A1(4 美元)和 A2(14 美元)。所以我想打印A2($14)的值,如果没有匹配,但是如果有匹配,我想打印$16中A1($15)的值。 【参考方案1】:

试试这个:

awk 'NR==1$(++NF)="noneff"NR>1$(++NF)=($4==$14)?$15:$141' so1186.txt

输出:

awk 'NR==1$(++NF)="noneff"NR>1$(++NF)=($4==$14)?$15:$141' so1186.txt | column -t
chr  SNP          BP     A1  TEST  N       OR      Z       P       chr  SNP          cm  BP     A2  A1  noneff
20   rs6078030    61098  T   ADD   421838  0.9945  -0.209  0.8344  20   rs6078030    0   61098  C   T   C
20   rs143291093  61270  G   ADD   422879  1.046   0.5966  0.5508  20   rs143291093  0   61270  G   A   A
20   rs4814683    61795  T   ADD   417687  1.015   0.6357  0.525   20   rs4814683    0   61795  G   T   G

【讨论】:

【参考方案2】:
awk '$(++NF)=($4==$15)?$4:$151' file

【讨论】:

以上是关于比较两列:如果匹配,则在新列中打印值,如果不匹配,则将第二列的值打印到新列的主要内容,如果未能解决你的问题,请参考以下文章

数据框行和列是不是包含字符串?如果是这样,则在新列中返回该字符串

匹配两列中的单元格值,如果匹配,则将另一个值复制到空白单元格

在字符串中查找与字典中的值匹配的单词,然后在新列中返回键

如何从单词列表中查找 DF 中的匹配单词并在新列中返回匹配的单词 [重复]

如果它们与使用 vba 的条件匹配,则在列中查找最小值和中值

如何比较来自 PySpark 数据帧的记录