我有一个包含四列数据的文件,如下所示:
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列中:
cluster-10
cluster-16因为cluster-12和cluster-9位于第2列,所以不打印它们。
发布于 2019-01-20 09:33:58
你能不能试着跟上。
awk '{a[$1];b[$2]} END{for(i in a){if(i in b){continue};print i}}' Input_file
cluster-10
cluster-16假设我们想要发送要在变量(awk变量)中比较的列的值,然后尝试执行以下操作。
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的值,然后它将比较它们的值(检查以获得一个列的唯一值,查看其他列)。
发布于 2019-01-20 09:17:29
当然,有多种方法可以实现这一点,但这里有一种是使用sed、sort和uniq。这里的关键是找到您关心的两列中每一列的唯一集合,然后使用uniq的-u选项仅打印第一个集合中的项目。下面的代码查看了第1列和第2列,但您可以轻松地调整以查看其他任何一对列。
#!/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发布于 2019-01-21 19:49:03
您也可以尝试使用Perl
$ 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
$或
$ perl -lane ' $kv{$F[0]}++; $kv2{$F[1]}++; END { for(keys %kv) { print unless $kv2{$_} }} ' greg.txt
cluster-10
cluster-16
$https://stackoverflow.com/questions/54272594
复制相似问题