вывести значения в одном столбце, но не в другом - PullRequest
0 голосов
/ 20 января 2019

У меня есть файл с четырьмя столбцами данных, который выглядит следующим образом:

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

Поскольку кластер-12 и кластер-9 находятся в столбце 2, они не печатаются.

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Не могли бы вы попробовать следующее.

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 в соответствии с новыми значениями столбцов, которые вы хотите сравнить, и тогда они будут сравнивать их значения (установите флажок, чтобы получить уникальные значения одного столбца, видя другой столбец).

0 голосов
/ 21 января 2019

Вы также можете попробовать 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
$
0 голосов
/ 20 января 2019

Есть, конечно, несколько способов сделать это, но вот один, использующий sed, sort и uniq. Ключевым моментом здесь является поиск уникального набора каждого из двух столбцов, которые вас интересуют, а затем используйте параметр -u для uniq, чтобы распечатать только элементы в первом наборе. Приведенный ниже код просматривает столбцы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...