首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印出现在一列中但没有出现在另一列中的值

打印出现在一列中但没有出现在另一列中的值
EN

Stack Overflow用户
提问于 2019-01-20 08:36:02
回答 3查看 72关注 0票数 2

我有一个包含四列数据的文件,如下所示:

代码语言:javascript
运行
复制
cluster-9  cluster-12   cluster-40  cluster-62
cluster-10 cluster-12   cluster-42  cluster-60
cluster-12 cluster-12   cluster-43  cluster-61
cluster-12 cluster-12   cluster-28  cluster-20
cluster-12 cluster-12   cluster-29  cluster-21
cluster-16 cluster-12   cluster-41  cluster-63
cluster-16 cluster-12   cluster-2   cluster-4
cluster-16 cluster-12   cluster-8   cluster-5
cluster-16 cluster-9    cluster-9   cluster-6
cluster-16 cluster-12   cluster-45  cluster-39  

我想提取列1中的唯一值,但不是特定的其他列中的值(成对)。例如,我希望能够比较第1列和第2列,并输出只有以下内容在第1列中,而不在第2列中:

代码语言:javascript
运行
复制
cluster-10
cluster-16

因为cluster-12和cluster-9位于第2列,所以不打印它们。

EN

回答 3

Stack Overflow用户

发布于 2019-01-20 09:33:58

你能不能试着跟上。

代码语言:javascript
运行
复制
awk '{a[$1];b[$2]} END{for(i in a){if(i in b){continue};print i}}' Input_file
cluster-10
cluster-16

假设我们想要发送要在变量(awk变量)中比较的列的值,然后尝试执行以下操作。

代码语言:javascript
运行
复制
awk -v col1="1" -v col2="2" '{a[$col1];b[$col2]} END{for(i in a){if(i in b){continue};print i}}'  Input_file
cluster-10
cluster-16

根据你想要比较的新列值更改变量-v col1-v col2的值,然后它将比较它们的值(检查以获得一个列的唯一值,查看其他列)。

票数 4
EN

Stack Overflow用户

发布于 2019-01-20 09:17:29

当然,有多种方法可以实现这一点,但这里有一种是使用sedsortuniq。这里的关键是找到您关心的两列中每一列的唯一集合,然后使用uniq-u选项仅打印第一个集合中的项目。下面的代码查看了第1列和第2列,但您可以轻松地调整以查看其他任何一对列。

代码语言:javascript
运行
复制
#!/bin/sh
#define a separator character and a column format, adjust to fit your data
sep=" "
col="\([a-zA-Z0-9_-]*\)$sep"

#get all values in column 1 and reduce to a unique set
col1=`sed "s/^$col.*/\\1/" file | sort | uniq`
#get all values in column2 and reduce to a unique set. Adjust for a different 
#column as necessary
col2=`sed "s/^$col$col.*/\\2/" file | sort | uniq`
#concatenate our results and spit out only unique items.
#Include column 2 twice so that we don't get any items only in column2
echo "$col1$col2$col2" | sort | uniq -u
票数 0
EN

Stack Overflow用户

发布于 2019-01-21 19:49:03

您也可以尝试使用Perl

代码语言:javascript
运行
复制
$ perl -lane ' $kv{$F[0]}++; $kv2{$F[1]}++; END { for(keys %kv) { unless ($kv2{$_}) { print "$_" } }}' greg.txt
cluster-10
cluster-16
$ cat greg.txt
cluster-9  cluster-12   cluster-40  cluster-62
cluster-10 cluster-12   cluster-42  cluster-60
cluster-12 cluster-12   cluster-43  cluster-61
cluster-12 cluster-12   cluster-28  cluster-20
cluster-12 cluster-12   cluster-29  cluster-21
cluster-16 cluster-12   cluster-41  cluster-63
cluster-16 cluster-12   cluster-2   cluster-4
cluster-16 cluster-12   cluster-8   cluster-5
cluster-16 cluster-9    cluster-9   cluster-6
cluster-16 cluster-12   cluster-45  cluster-39
$

代码语言:javascript
运行
复制
$ perl -lane ' $kv{$F[0]}++; $kv2{$F[1]}++; END { for(keys %kv) { print unless $kv2{$_} }} ' greg.txt
cluster-10
cluster-16
$
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54272594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档