Mantenha os valores em uma determinada coluna com base na prioridade e remova os outros valores para cada linha

0

Ao dar este comando, estou ficando assim

awk '{print $7}' myfile.txt

/myfolder/1001.AB.txt.gz,/myfolder/1001.CD.txt.gz
/myfolder/1011.filtered.txt,/myfolder/1011.AB.txt.gz,myfolder/1011.CD.txt.gz
/myfolder/1003.AB.txt.gz,/myfolder/1003.CD.txt.gz
/myfolder/1024.merged.txt.gz,/myfolder/1024.filtered.txt,/myfolder/1024.AB.txt.gz,/myfolder/1024.CD.txt.gz
/myfolder/1014.merged.txt.gz
/myfolder/1020.AB.txt.gz,/myfolder/1020.CD.txt.gz
/myfolder/1021.filtered.AB.txt.gz,/myfolder/1021.merged.CD.txt.gz
/myfolder/1031.filtered.txt

Mas eu quero assim A prioridade é [1] merged.txt.gz , [2] AB.txt.gz & CD.txt.gz , [3] filtered.txt Com base na prioridade, mantenha os valores e remova os outros valores em [2] AB.txt.gz & CD.txt.gz mantém os dois valores

OUTPUT

/myfolder/1001.AB.txt.gz,/myfolder/1001.CD.txt.gz
/myfolder/1011.AB.txt.gz,/myfolder/1011.CD.txt.gz
/myfolder/1003.AB.txt.gz,/myfolder/1003.CD.txt.gz
/myfolder/1024.merged.txt.gz
/myfolder/1014.merged.txt.gz
/myfolder/1020.AB.txt.gz,/myfolder/1020.txt.CD.gz
/myfolder/1021.merged.txt.gz
/myfolder/1031.filtered.txt
    
por bioinform 16.11.2017 / 09:31

1 resposta

1
sed 's/.*<TAB>//;/merged.txt.gz/!b2
  s/,*[^,]*AB.txt.gz,*//g;s/,*[^,]*CD.txt.gz,*//g
  :1
  s/,*[^,]*filtered[^,]*,*//g;b
  :2
  /AB.txt.gz/b1
  /CD.txt.gz/b1' myfile.txt

Como funciona:

  • Como você só precisa do último dos colmuns separados por TAB, o s/.* TAB // remove tudo até e incluindo a última TAB. Note que você pode ter que digitar ctrl-v antes do TAB no seu shell. Ou para o% GNUsed, use \t em vez de um literal TAB.
  • Se houver merged.txt.gz nessa linha, o salto para marcar 2 ( b2 ) não será executado devido ao ! , portanto, a segunda linha do script remove AB e CD itens e a quarta linha remove filtered itens, antes que a b sem marca pule para o final do script.
  • Se não houver merged.txt.gz nessa linha, a primeira linha nos enviará para marcar :2 , em seguida, se houver AB.txt.gz , a sexta linha nos enviará para marcar :1 para remover os itens filtered , ou se houver CD.txt.gz , a última linha faz o mesmo
  • Se não houver nem merged nem AB não CD , a linha será produzida sem alteração.

Isso produz a saída para sua entrada dada (exceto por uma barra que já está faltando na linha 2 da sua entrada). Você pode modificá-lo para corresponder à sua entrada original.

Se nem sempre é a última coluna, mas sempre a sétima, em vez de s/.* TAB // use s/\([^ TAB ] TAB \}\{6\}//;s/ TAB .*// para remover os primeiros seis e todas as colunas à direita.

    
por 16.11.2017 / 10:58