Estou assumindo que os nomes podem aparecer em qualquer ordem e que Helen Sarah
deve, portanto, ser considerado como uma duplicata de Sarah Helen
. Se assim for, isso deve fazer o que você quer. É muito semelhante à resposta de Gnouc, mas pode lidar com enganos que aparecem em ordem diferente.
Eu usei um arquivo de entrada ligeiramente diferente do seu para poder testar mais casos:
Sarah,Masha,Helen
Betty,Sarah,Helen
John,Harold,Frank,Daisy
Masha,Sarah,Helen,Gerorge
Helen,Sarah,Masha
Aqui está o gawk como um forro e sua saída:
$ awk -F, '{for(i=1;i<NF;i++){for(j=i+1;j<=NF;j++){if($i > $j){k[$i][$j]}else{k[$j][$i]}}}}END{for(n in k){for (l in k[n]){print n,l}}}' names.txt
John Daisy
John Frank
John Harold
Sarah Masha
Sarah Betty
Sarah Helen
Frank Daisy
Masha Helen
Harold Daisy
Harold Frank
Helen Betty
E aqui está a mesma coisa:
{
## For all fields from first to penultimate
for(i=1;i<NF;i++){
## For all fields from second to last
for(j=i+1;j<=NF;j++){
## This is to avoid duplicates, $i and $j are names
## by comparing (sorting) them, I make sure that they
## will be stored in the array consistently so I will
## count 'Dick Harry' as a duplicate of 'Harry Dick'
if($i > $j){
k[$i][$j]
}
else{
k[$j][$i]
}
}
}
}
END{
## Go through the array k tath holds the name pairs
for(n1 in k){
## It is a 2 dimensional array so n1 is the first name
## and n2 will be the second
for (n2 in k[n1]){
print n1,n2
}
}
}