Você pode tentar isso:
$ sort -rt"," -k2,3 file.csv |
awk -F, '{a[$2][$3]=$0; if(a[$2][$4]){print a[$2][$4]; print;}}'
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
Explicação
- O
sort
classificará o arquivo com base nos campos 2 e 3, de modo que as linhas com o mesmo PDBID sejam classificadas juntas e de acordo com a posição do primeiro resíduo do recurso.-r
inverte a classificação (para que números maiores sejam impressos primeiro),-t,
define o delimitador de campo como,
e-k
define os campos para classificar.
Quanto ao script awk
:
-
-F,
: defina o delimitador de campo para,
. -
a[$2][$3]=$0;
: esta é uma lista de listas, uma matriz bidimensional. Para a primeira linha, por exemplo, seriaa[4tov][1404]=$0
.a
é apenas o nome da matriz. O valor é definido para a linha atual,$0
. -
if(a[$2][$4])
: se o quarto campo (o segundo resíduo) foi visto associado ao mesmo PDBID como primeiro resíduo. -
print a[$2][$4]; print;
: imprime a linha em que foi visto (desde que foi salvo como o valor da matriza
) e a linha atual.
Eu não tenho acesso ao OSX para verificar, mas com base em seu comentário , parece que o OSX awk
, ao contrário de GNU awk
, não consegue lidar com matrizes multidimensionais. Então, aqui está a mesma coisa em Perl:
sort -rt"," -k2,3 file.csv |
perl -F"," -ane '$k{$F[1]}{$F[2]}=$_;
print "$k{$F[1]}{$F[3]}$_" if $k{$F[1]}{$F[3]}'