AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 781678
Accepted
Matteo
Matteo
Asked: 2024-08-10 16:13:42 +0800 CST2024-08-10 16:13:42 +0800 CST 2024-08-10 16:13:42 +0800 CST

a execução de comandos com base no tamanho do arquivo falha sem problemas aparentes

  • 772

Eu estava trabalhando em um trabalho de array para um pipeline pequeno e precisava de uma maneira de executar um comando específico com base no tamanho do arquivo. Encontrei este post e similares que descrevem como fazer isso. No momento estou usando o seguinte:

find $d/*.fasta -size +100M -exec sh -c '
     chromap -i -r $1 -o $1.index

     chromap --preset hic -x $1.index -r $1 -1 $d/hi-c/${ID}_1.fq.gz -2 $d/hi-c/${ID}_2.fq.gz --SAM -o /dev/stdout -t 48 | \
         samtools view -bS -@ 48 | samtools sort -n -@ 48 | samtools view -h | sed -e "s/\/.//" | samtools view -bS -o ${ID}.bam -@ 48
     ' sh {} \;

que, além da bioinfo e das ferramentas utilizadas que funcionam, parece executar apenas a primeira linha de comando - chromap -i -r $1 -o $1.index. Então, por algum motivo, ao entrar no segundo conjunto de instruções, o script retorna o seguinte:

Não é possível encontrar o arquivo de sequência /hi-c/_1.fq.gz

indicando que não tem conhecimento das variáveis ​​de ambiente que usei com sucesso até agora ou não pode calcular mais de duas operações ao mesmo tempo? Não tenho pistas ... tentei também algo mais simples, por exemplo

mkdir $d/scaffolding
find $d/*.fasta -size +100M -exec sh -c '
     chromap -i -r $1 -o $1.index && mv $1 $1.index $d/scaffolding
' sh {} \;

mas Bash reclama de: mv: the destination '/scaffolding' is not a directory.

O que devo fazer para que um (ou ambos) funcione? Estou faltando alguma coisa, por favor, se alguém tiver alguma ideia sobre esse assunto, me avise! Desde já, obrigado.

bash
  • 2 2 respostas
  • 315 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-08-10T16:44:01+08:002024-08-10T16:44:01+08:00
    export d ID
    find -H "$d"/*.fasta -prune -size +100M -exec bash -o pipefail -c '
      ret=0
      for file do
        chromap -i -r "$file" -o "$file.index" &&
          chromap --preset hic \
                  -x "$file.index" \
                  -r "$file" \
                  -1 "$d/hi-c/${ID}_1.fq.gz" \
                  -2 "$d/hi-c/${ID}_2.fq.gz" \
                  --SAM -o /dev/stdout -t 48 |
            samtools view -bS -@ 48 |
            samtools sort -n -@ 48 |
            samtools view -h |
            sed "s:/.::" |
            samtools view -bS -o "${ID}.bam" -@ 48 ||
          ret=$?
        done
        exit "$ret"
      ' bash {} +
    

    Abordando vários problemas:

    • a menos que você exporte $de $IDo shiniciado findnão consiga vê-los
    • Sem -H, para os fastaarquivos que são links simbólicos, findverificaria o tamanho do link simbólico em vez do tamanho do arquivo fasta
    • Sem -prune, para aqueles que são diretórios, finddesceríamos para eles. Você provavelmente desejaria excluí-los completamente ! -type dou incluir apenas arquivos regulares com -type f(o que inclui links simbólicos para arquivos regulares com -H). Adicionar essas verificações não elimina a necessidade -prune(ou -maxdepth 0se estiver usando GNU findou compatível).
    • Você esqueceu de citar as expansões dos parâmetros. Você pode escapar sem zsh, mas não sh nem bash.
    • Você não está verificando o status dos comandos antes de executar o próximo. Aqui adicionei a pipefailopção para que os pipelines retornem falha se algum dos comandos falhar. Essa agora é uma shopção padrão, mas existem algumas shimplementações como dashessa que ainda não oferecem suporte a ela, então substituí shpor bash, embora você possa usar qualquer outra shimplementação que suporte pipefail.
    • Você tinha aspas simples dentro de aspas simples, o que significava que s/\/.//estavam fora das aspas, o que significava que era o mesmo que s//.//which não é um código válido sed. Aqui estamos usando aspas duplas para as aspas internas e alternando de /para :para o separador para evitar ter que escapar do /. Observe que isso s:/.::remove a primeira ocorrência /seguida por qualquer caractere único sem nada. Remover /.literalmente, isso é s:/\.::remover s:/\.::gtodas as ocorrências.
    • com o -exec sh ... {} ';', você está executando um shpor arquivo e também a falha de qualquer um deles não é relatada. Substituindo por -exec sh ... {} +endereços ambos.

    Se você pudesse mudar para o zsh, a maioria desses problemas poderia ser facilmente evitada.

    set -o pipefail
    errors=0
    for file (*.fasta(N-.LM+100)) {
      chromap -i -r $file -o $file.index &&
          chromap --preset hic \
                  -x $file.index \
                  -r $file \
                  -1 $d/hi-c/${ID}_1.fq.gz \
                  -2 $d/hi-c/${ID}_2.fq.gz \
                  --SAM -o /dev/stdout -t 48 |
            samtools view -bS -@ 48 |
            samtools sort -n -@ 48 |
            samtools view -h |
            sed 's:/.::' |
            samtools view -bS -o ${ID}.bam -@ 48 ||
          (( error++ ))
    }
    
    • zsh não possui aquele recurso incorreto do shell Bourne, pelo qual expansões sem aspas estão sujeitas a split+glob para que você possa omitir as aspas.
    • zsh globs possuem a maioria dos findrecursos integrados do , então você não precisa combinar shell globs (seu *.fasta) com find.
    • isso significa que não há necessidade de aspas aninhadas, isso significa que não há necessidade de executar um shell separado e de exportar variáveis ​​para ele, o que significa que podemos retornar mais facilmente uma contagem de erros.
    • zsh suporta pipefail(ao contrário de algumas shimplementações).
    • 8
  2. Kusalananda
    2024-08-10T16:39:46+08:002024-08-10T16:39:46+08:00

    Você assume que algumas variáveis ​​​​do shell em seu sh -cscript embutido são herdadas pelo ambiente. Estes são de ID. Se o shell não os exportar para o ambiente antes de findser chamado, o sh -cscript não os verá e substituirá strings vazias em seus lugares.

    Portanto, antes de ligar find, certifique-se de ter

    export d ID
    

    ... no seu roteiro.

    Como alternativa, defina-os para o findcomando ao chamá-lo, assim:

    d=$d ID=$ID find "$d"/*.fasta -size +100M -exec ...
    

    Lembre-se também de colocar aspas duplas em todas as expansões de variáveis ​​em seus scripts:

    export d ID
    
    find "$d"/*.fasta -size +100M -exec sh -c '
        chromap -i -r "$1" -o "$1.index"
    
        chromap --preset hic -x "$1.index" -r "$1" -1 "$d/hi-c/${ID}_1.fq.gz" -2 "$d/hi-c/${ID}_2.fq.gz" --SAM -o /dev/stdout -t 48 |
        samtools view -bS -@ 48 |
        samtools sort -n -@ 48 |
        samtools view -h | sed -e 's/\/.//' |
        samtools view -bS -o "${ID}.bam" -@ 48' sh {} \;
    
    • 3

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve