![如果两列与第一列中的任何行都不匹配,如何比较第二列中的这些行并置零?](https://linux22.com/image/91741/%E5%A6%82%E6%9E%9C%E4%B8%A4%E5%88%97%E4%B8%8E%E7%AC%AC%E4%B8%80%E5%88%97%E4%B8%AD%E7%9A%84%E4%BB%BB%E4%BD%95%E8%A1%8C%E9%83%BD%E4%B8%8D%E5%8C%B9%E9%85%8D%EF%BC%8C%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E7%AC%AC%E4%BA%8C%E5%88%97%E4%B8%AD%E7%9A%84%E8%BF%99%E4%BA%9B%E8%A1%8C%E5%B9%B6%E7%BD%AE%E9%9B%B6%EF%BC%9F.png)
我有一个文件看起来像:
文件1:
id1 id6
id5 id2
id2 id3
id6 id500
如果我们将第二列的内部与第一列进行比较,我们可以注意到第二列和第一列中都存在 id6 和 id2 。但 id3 和 id500 存在于第二列中,而不存在于第一列中。我想用 0 替换后者,因为它们没有出现在第一列中。所以输出应该是:
输出:
id1 id6
id5 id2
id2 0
id6 0
有什么建议吗?我尝试了“join”中的一些命令,但没有得到我想要的。请注意,我的真实数据很大,这是一个小例子
答案1
两遍解决方案 - 在第一遍中将字段 1 中的所有值存储到数组中a
,在第二遍中打印每一行,如果第二个字段不在数组中,则将其设置为 0a
awk 'first{a[$1]; next}; {print $1, !($2 in a)? 0: $2}' first=1 file first=0 file
答案2
#/bin/perl
use strict;
use warnings;
my %hash;
my @array;
my( $key, $value );
while( <ARGV> )
{
chomp;
@array = split '\t';
$hash{ $array[0] } = $array[1];
}
while(( $key, $value ) = each %hash )
{
printf "$key\t%s\n",
exists( $hash{ $value }) ? $value : "0";
}
但不确定“巨大”是什么意思,无论您的数据大小如何,这就是它使用的量。抱歉,如果您正在寻找 POSIX 命令类型解决方案,我以前从未在这些论坛上回答过。