Filtra o arquivo csv com base em valores de coluna estendidos

1

Eu tenho o seguinte arquivo csv:

ID,PDBID,FirstResidue,SecondResidue,ThirdResidue,FourthResidue,Pattern
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_3,4tov,1043,1044,1047,1048,CC/GA Naked ribose-zipper
RZ_AUTO_4,4tov,1556,1557,1514,1515,CC/GA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_6,4tow,766,767,1524,1525,AA/CG Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

Eu preciso percorrer cada linha e imprimir as linhas nas quais o valor de FirstResidue e SecondResidue pode ser estendido (o que significa que o SecondResidue se torna o FirstResidue em uma linha diferente com o mesmo PDBID). Por exemplo, (linha RZ_AUTO_1 e linha de linha RZ_AUTO_2) AND (linha RZ_AUTO_5 e linha de linha RZ_AUTO_7). A saída deve ser algo como isto:

RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper

É possível fazer isso usando o awk ou outros métodos unix? Estou usando o OSX.

    
por Sri 11.02.2015 / 01:39

3 respostas

4

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, seria a[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 matriz a ) 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]}'
    
por 11.02.2015 / 01:58
0

Você pode usar textql para consultar os dados da planilha como um banco de dados SQL.

    
por 11.02.2015 / 01:56
0

Através do python3 usando re module.

#!/usr/bin/python3
import re
import sys
j = sys.argv[1]
with open(j) as f:
    fil = f.read()
m = re.findall(r'(?s)(?:^|\n)([^,]*,([^,]*),[^,]*,([^,]*)[^\n]*).*?\n([^,]*,,,[^\n]*)', fil)
for i in m:
    print(i[0]+'\n'+i[-1])

Salve o código acima em um arquivo chamado script.py e execute este arquivo executando o comando abaixo no terminal.

python3 script.py inputfile

Demonstração de regex

$ python3 script.py file.csv
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
    
por 14.02.2015 / 13:12