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 / coding / Perguntas / 77164954
Accepted
PesKchan
PesKchan
Asked: 2023-09-24 05:18:10 +0800 CST2023-09-24 05:18:10 +0800 CST 2023-09-24 05:18:10 +0800 CST

Adicionando nova tentativa ao shell script

  • 772

Meu objetivo é aumentar o número de novas tentativas para esta validação fastq que às vezes falha devido a problemas de rede, embora haja dados para o ID NCBI SRA fornecido, mas falha. Portanto, preciso aumentar a repetição pelo menos 5 vezes antes de abortar.

Como faço o mesmo?

set -x
PS4='[\\d \\t] '

# Check parameter for error
check=0
# Print fastq-dump executable path
echo \$(which fastq-dump)

# Loop through all parameters to check validity
for file in \$@;
do
    cp \${file} .
    # Extract filename for sampleID
    file_basename=\$(basename \${file})
    id=\${file_basename%".id"}
    # Start validation
    echo "Checking \${id}..."
    # Download start of fastq
    fastq-dump $(get_ngc()) -X 1 -Z --split-spot \${id} > \${id}.test.fastq 2> \${id}.test.log
    # Get number of lines downloaded to valildate for error
    numLines=\$(cat \${id}.test.fastq | wc -l)
    if [ \$numLines -gt 0 ]; then
        echo "\${id} has data... OK"
    else
        echo "\${id} does not have data... ERROR"
        check=1
    fi
done
# Exit with error if some fastqs not accessible
if [ \$check -gt 0 ]; then
    echo "ERROR: One or more samples have inaccessible fastqs.. exiting"
    exit 1
fi

############ ATUALIZAR ###############

#!/usr/bin/env cwl-runner

cwlVersion: cwl:v1.0
class: CommandLineTool
requirements:
- class: DockerRequirement
  dockerPull: kcm1400/validate_fastq_ncbi_sra:v1
- class: InlineJavascriptRequirement
  expressionLib:
  - var get_ngc= function(){ if(inputs["ngc_file"]==null){ return " "; }else{ return
    "--ngc "+inputs["ngc_file"].path+" "; } }
- class: InitialWorkDirRequirement
  listing:
  - entry: |-
      set -x
      PS4='[\\d \\t] '

      # Check parameter for error
      check=0
      # Print fastq-dump executable path
      echo \$(which fastq-dump)

      # Loop through all parameters to check validity
      for file in \$@;
      do
          cp \${file} .
          # Extract filename for sampleID
          file_basename=\$(basename \${file})
          id=\${file_basename%".id"}
          # Start validation
          echo "Checking \${id}..."
          # Download start of fastq
          fastq-dump $(get_ngc()) -X 1 -Z --split-spot \${id} > \${id}.test.fastq 2> \${id}.test.log
          # Get number of lines downloaded to valildate for error
          numLines=\$(cat \${id}.test.fastq | wc -l)
          if [ \$numLines -gt 0 ]; then
              echo "\${id} has data... OK"
          else
              echo "\${id} does not have data... ERROR"
              check=1
          fi
      done
      # Exit with error if some fastqs not accessible
      if [ \$check -gt 0 ]; then
          echo "ERROR: One or more samples have inaccessible fastqs.. exiting"
          exit 1
      fi
    entryname: validate_fastq.sh
    writable: false
label: validate_fastq_ncbi_sra
stdout: validate_fastq.log.txt
inputs:
  sra_ID:
    type:
    - type: array
      items: string
    - 'null'
    inputBinding:
      position: 1
  id_file:
    type:
    - type: array
      items: File
    - 'null'
    inputBinding:
      position: 2
  ngc_file:
    type:
    - File
    - 'null'
    inputBinding:
      position: 3
outputs:
  output_log:
    type: stdout
    label: output log file
  ncbi_ids:
    type:
      type: array
      items: File
    outputBinding:
      glob:
      - '*.id'
baseCommand:
- sh
- validate_fastq.sh

O arquivo CWL para o mesmo

shell
  • 1 1 respostas
  • 35 Views

1 respostas

  • Voted
  1. Best Answer
    tripleee
    2023-09-24T17:08:01+08:002023-09-24T17:08:01+08:00

    Esta é uma resposta provisória. Esperamos que, no mínimo, isso possa ajudá-lo a fazer uma pergunta mais bem formulada no futuro.

    Você mencionou em um comentário que as barras invertidas funcionam para você em um "arquivo cwl", mas não explicou o que é um "arquivo cwl". Se você estiver se referindo à Common Workflow Language, precisaremos saber mais sobre a estrutura YAML em torno do script; certamente existem opções de formatação escalar YAML onde barras invertidas não são necessárias.

    Sem mais detalhes, digamos apenas que para um "shell script" essas barras invertidas estão destruindo a funcionalidade e, por isso, eu as removi.

    Também não está claro qual condição de erro você deseja capturar exatamente. Presumivelmente fastq-dumpé a fonte desses erros. Se estiver escrito corretamente, você deverá ser capaz de dizer simplesmente

    if fastq-dump --options arguments; then ...
    

    mas mantive sua abordagem mais desajeitada de contar o número de linhas de saída para garantir a segurança.

    #!/bin/sh
    # ^ explicitly name which shell you are using
    # See also https://en.wikipedia.org/wiki/Shebang_(Unix)
    
    set -x
    PS4='[\\d \\t] '
    
    check=0
    # Avoid useless use of echo
    # https://www.iki.fi/era/unix/award.html#echo
    # Prefer POSIX "command -v" over nonstandard "which"
    command -v fastq-dump
    
    # Quote all file names
    # https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable
    for file in "$@"; do
        cp "$file" .
        # Basename knows how to trim extension
        id=$(basename "$file" .id)
        # Write diagnostics to stderr
        echo "$0: Checking $id..." >&2
        # Truncate log so we can append in a loop; see below
        : > "$id".test.log
        # Loop until success, or retries exhausted
        for retry in 1 2 3 4 5; do
            # Append rather than overwrite error log, in case we retry
            fastq-dump $(get_ngc()) -X 1 -Z --split-spot "$id" > "$id".test.fastq 2>> "$id".test.log
            # Avoid useless cat
            # https://stackoverflow.com/questions/11710552/useless-use-of-cat 
            numLines=$(wc -l < "$id".test.fastq)
            if [ $numLines -gt 0 ]; then
                echo "$0: $id has data... OK" >&2
                break
            else
                echo "$0: $id does not have data... ERROR" >&2
                case $retry in
                 5) echo "$0: $id: aborting, after 5 attempts" >&2
                    check=1;;
                 *) # Sleep before retry
                    sleep 5;;
                esac
            fi
        done
    done
    # Exit with error if some fastqs not accessible
    if [ $check -gt 0 ]; then
        echo "$0: ERROR: One or more samples have inaccessible fastqs.. exiting" >&2
        exit 1
    fi
    

    Muitos dos erros de iniciante aqui seriam detectados e muitas vezes até corrigidos por https://shellcheck.net/; provavelmente execute seus scripts por meio desta ferramenta antes de perguntar aqui, para evitar distrair os respondentes. Obviamente, às vezes a correção também resolverá o problema que você queria perguntar.

    $(get_ngc())ainda parece um erro de sintaxe, mas acho que faz parte do CWL...?

    • 2

relate perguntas

  • Por que meu código Shell sempre retorna par, mesmo que o número seja ímpar

  • Extraia texto usando o comando AWK em várias colunas

  • Alterar nome do arquivo no Pipe [duplicado]

  • O comando Executar contém aspas duplas no Ansible

Sidebar

Stats

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

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