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 / 411602
Accepted
yukashima huksay
yukashima huksay
Asked: 2017-12-19 07:06:34 +0800 CST2017-12-19 07:06:34 +0800 CST 2017-12-19 07:06:34 +0800 CST

Como fornecer uma lista separada por vírgulas como argumentos para o próximo comando

  • 772

Eu tenho um script s1que gera uma lista de números separados por ',' por exemplo 1,2,3,4. Agora, quero fornecer esses números ao script s2como argumentos, para que s2 seja executado em cada um deles e exiba seu resultado em uma linha separada. Por exemplo, se s2 multiplica números por dois, este seria o resultado que estou procurando:

2
4
6
8

O que estou fazendo agora é:

s1 | xargs -d "," | xargs -n1 s2

Mas eu sinto que estou fazendo isso de uma maneira tão tola! Então minha pergunta é:

Qual é a maneira correta de fazer isso?

Meu problema com minha solução é que ele está chamando xargs duas vezes e iterando a entrada duas vezes, o que não é razoável aos meus olhos, é claro, por meio de desempenho! A resposta xargs -d "," -n1parece boa, mas não tenho certeza se é uma iteração apenas uma vez. Em caso afirmativo, verifique isso em sua resposta e eu aceitarei. A propósito, prefiro não usar o Perl, pois ele ainda está iterando duas vezes e também o Perl pode não existir em muitos sistemas.

pipe xargs
  • 3 3 respostas
  • 13256 Views

3 respostas

  • Voted
  1. Best Answer
    George Udosen
    2017-12-19T07:14:55+08:002017-12-19T07:14:55+08:00

    Isso deve funcionar igualmente bem:

    s1 | xargs -d "," -n1 s2
    

    Caso de teste:

    printf 1,2,3,4 | xargs -d ',' -n1 echo
    

    Resultado:

    1
    2
    3
    4
    

    Se s1gerar essa lista seguida por um caractere de nova linha, você deseja removê-la, caso contrário, a última chamada seria com 4\nem vez de 4:

    s1 | tr -d '\n' | xargs -d , -n1 s2
    
    • 20
  2. Jeff Schaller
    2017-12-19T09:34:21+08:002017-12-19T09:34:21+08:00

    Se s2puder aceitar vários argumentos, você pode fazer:

    (IFS=,; ./s2 $(./s1))
    

    que substitui temporariamente o IFS para ser uma vírgula, tudo em um subshell, para que s2veja a saída s1dividida por vírgulas. O subshell é uma maneira abreviada de alterar o IFS sem salvar o valor anterior ou redefini-lo.

    Uma versão anterior desta resposta estava incorreta, provavelmente devido a uma configuração restante do IFS, corrompendo os resultados. Obrigado a ilkkachu por apontar meu erro .

    Para fazer um loop manualmente sobre as saídas e fornecê-las individualmente para s2, demonstrando aqui como salvar e redefinir o IFS:

    oIFS="$IFS"
    IFS=,
    for output in $(./s1); do ./s2 "$output"; done
    IFS="$oIFS"
    

    ou execute os bits IFS em um subshell como antes:

    (
    IFS=,
    for output in $(./s1); do ./s2 "$output"; done
    )
    
    • 6
  3. Gilles Quenot
    2017-12-19T07:13:28+08:002017-12-19T07:13:28+08:00

    Tente isto:

    s1 | perl -pe 's/,/\n/g' | xargs -n1 s2
    
    • 1

relate perguntas

  • Passe o identificador para o pipeline stdin down

  • Xargs Opção `-J`

  • Como canalizar um comando bash e manter Ctrl + C funcionando?

  • Por que canalizar `mysql` para 'tail' altera o formato de saída?

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

Sidebar

Stats

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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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